RES as
(
SELECT code , payement,
sum(A.ALLPAYMENT) as ACTUAL_PAYMENT,
A.NAME
FROM FINANCES A
WHERE payement= '6396'
and (ENDDATE>= CURRENT_TIMESTAMP)
and (BILLREFRENCE<> '' or
(case when ( CONVERT (int, (select BILLTIME from MYCALENDAR CL
where CL.code = A.code and CL.NAME=
A.NAME
)
)
> CONVERT (INT, REPLACE( CONVERT(VARCHAR(8), GETDATE(), 108),
':', '' ) )
) then LEVEL in ('300', '100', '404')
else
LEVEL in ('300','404')
)
)
GROUP BY code, payement, A.NAME)
OR条件需要为“OR LEVEL in('300','100','404')”或 “或等级('300','404')” 如果当前的系统时间大于BILLTIME它的水平('300','404'),如果不是,它的水平为('300','100','404')
PS:BILLTIME采用军事时间“130000”的格式,因此转换。
答案 0 :(得分:1)
由于WHERE
子句中的表达式的结果是布尔值,因此您始终可以将其重写为布尔表达式而不使用CASE
表达式。在某些情况下,逻辑也可以简化。
由于第一个案例中的IN
列表与第二个案例中的IN
列表只有一个成员'100'
不同,因此您可以重新构建条件以避免IN
在CASE
表达式中列出:
SELECT
...
WHERE LEVEL in ('300','404')
OR LEVEL = '100' AND CONVERT(...) > CONVERT(...)