CAS中的CASE语句在OR内部和SQL中

时间:2017-08-29 11:01:54

标签: sql nested case case-when

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”的格式,因此转换。

1 个答案:

答案 0 :(得分:1)

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

由于第一个案例中的IN列表与第二个案例中的IN列表只有一个成员'100'不同,因此您可以重新构建条件以避免INCASE表达式中列出:

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