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(...)
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(...)