簡體   English   中英

如何在oracle sql中的where條件中使用case語句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM