[英]How to use case statement in where condition in oracle sql?
SELECT DY,ME,NONME
FROM (
SELECT LEVEL, TO_CHAR(SYSDATE+ROWNUM,'DAY') DY , 0 ME, 2 NONME
FROM DUAL
CONNECT BY LEVEL <=10
)
WHERE ?
如果條件是(ME < NONME)
not in ('SATURDAY','SUNDAY')
當(ME> NONME)
然后not in ('FRIDAY', 'SATURDAY')
如何使用?
(
(ME<NONME and .... not in (...)) OR
(ME>NONME and .... not in (...))
)
假設你的測試數據如下:
select * from tab;
M N DY
- - --------
A B FRIDAY
A B SATURDAY
A B SUNDAY
B A FRIDAY
B A SATURDAY
B A SUNDAY
您需要評估蘊涵A --> B
可以重寫為NOT A OR B
使用此規則,您的查詢是
select * from tab
where
-- (ME < NONME) --> not in ('SATURDAY','SUNDAY')
(not (ME < NONME) or DY not in ('SATURDAY','SUNDAY')) AND
-- (ME> NONME) --> not in ('FRIDAY', 'SATURDAY')
(not (ME > NONME) or DY not in ('FRIDAY', 'SATURDAY'))
;
給予
M N DY
- - --------
A B FRIDAY
B A SUNDAY
您可以使用包含不區分大小寫的NOT regexp_like()
和帶括號的AND
運算符和組合這些表達式的OR
運算符的查詢:
WITH T AS
(
SELECT LEVEL, TO_CHAR(SYSDATE + LEVEL, 'DY','NLS_DATE_LANGUAGE=ENGLISH') DY, 0 ME, 2 NONME
FROM DUAL
CONNECT BY LEVEL <= 10
)
SELECT *
FROM T
WHERE ( NOT regexp_like(dy,'sat|sun','i') AND ME < NONME )
OR ( NOT regexp_like(dy,'sat|fri','i') AND ME > NONME )
如果您熱衷於使用case..when
語句,則應按以下方式進行:
.....
Where case
when ME < NONME and dy not in ('SATURDAY','SUNDAY')
then 1
When ME > NONME and DY not in ('FRIDAY', 'SATURDAY')
then 1
end = 1
干杯!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.