如何在oracle sql中的where条件下使用case语句?

如何在oracle sql中的where条件下使用case语句?,sql,oracle,case-when,Sql,Oracle,Case When,如果条件是MEB 使用此规则,您的查询是 select * from tab; M N DY - - -------- A B FRIDAY A B SATURDAY A B SUNDAY B A FRIDAY B A SATURDAY B A SUNDAY 您可以使用一个查询,该查询包含不区分大小写的NOT regexp_like(类似于带括号的AND运算符)和组合这些表达式的OR运算符: M N DY - - -------- A B FRIDAY

如果条件是ME 当我不在时,我就不在“星期五”、“星期六”


如何使用?

假设您的测试数据如下:

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 and .... not in (...)) OR
  (ME>NONME and .... not in (...))
)
您需要计算可以重写为非A或B的含义A->B

使用此规则,您的查询是

select * from tab;

M N DY      
- - --------
A B FRIDAY  
A B SATURDAY
A B SUNDAY  
B A FRIDAY  
B A SATURDAY
B A SUNDAY  

您可以使用一个查询,该查询包含不区分大小写的NOT regexp_like(类似于带括号的AND运算符)和组合这些表达式的OR运算符:

M N DY      
- - --------
A B FRIDAY  
B A SUNDAY  
如果您热衷于使用case..when语句,则应按照以下步骤进行:

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 )

干杯

通常最好在WHERE子句中使用AND/OR结构而不是大小写表达式。顺便说一下,如果只是为了避免删减空格和指定语言,最好使用缩写名称,例如to_charsysdate+rownum,'DY','nls_date_language=English',而这段代码可能会回答这个问题,提供关于原因和/或的其他上下文。
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 )
.....
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