CASE 语句 inside OR inside AND in SQL

CASE statement inside OR inside AND in SQL

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”,因此需要进行转换。

由于 WHERE 子句中表达式的结果是布尔值,您始终可以将其重写为布尔表达式,而无需使用 CASE 表达式。在某些情况下,逻辑也可以简化。

由于第一种情况中的 IN 列表与第二种情况中的 IN 列表只有一个成员 '100' 不同,您可以重构条件以避免 IN 列表在 CASE 表达式中:

SELECT
    ...
WHERE LEVEL in ('300','404')
   OR LEVEL = '100' AND CONVERT(...) > CONVERT(...)