2017-08-29 213 views
1
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条件需要是任一 “或级别中( '300', '100', '404')” 或 “OR中( '300' LEVEL的内部或内部和, '404')“ 如果当前SYSTEMTIME比BILLTIME更大它的水平( '300', '404'),如果不是,它是在( '300', '100' LEVEL, '404')CASE语句SQL

PS:BILLTIME的格式是军事时间“130000”,因此转换。

+3

别在'where'子句中使用'case'。它可以用简单的布尔逻辑重写。 –

+0

CASE不是(声明的一部分),而是一个有条件的'EXPRESSION'(就像C中的三元表达式) – joop

回答

1

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

由于从第一种情况下IN列表仅由一个部件,'100'IN列表在第二种情况下的不同,可以重新构造条件,以避免CASE表达式内IN列表:

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

duh!这工作,我不知道我怎么看不到。非常感谢你 :) –