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

Posted

技术标签:

【中文标题】如何在oracle sql中的where条件中使用case语句?【英文标题】:How to use case statement in where condition in oracle sql? 【发布时间】:2019-12-20 08:11:22 【问题描述】:
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 &lt; NONME),那么not in ('SATURDAY','SUNDAY')

(ME&gt; NONME) 然后not in ('FRIDAY', 'SATURDAY')

如何使用?

【问题讨论】:

WHERE子句中使用AND/OR结构而不是case表达式通常更好。跨度> 顺便说一句,最好使用缩写名称(如果只是为了避免修剪空白)并指定一种语言,例如to_char(sysdate+rownum, 'DY', 'nls_date_language=English') 【参考方案1】:
(
  (ME<NONME and .... not in (...)) OR
  (ME>NONME and .... not in (...))
)

【讨论】:

虽然此代码可能会回答问题,但提供有关原因和/或 how this code answers the question improves its long-term value 的其他上下文。【参考方案2】:

假设你的测试数据如下:

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 --&gt; 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  

【讨论】:

【参考方案3】:

您可以使用包含不区分大小写的 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 )

Demo

【讨论】:

【参考方案4】:

如果您热衷于使用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

干杯!!

【讨论】:

以上是关于如何在oracle sql中的where条件中使用case语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化Oracle在where条件中用了自定义函数的SQL语句

oracle sql中where条件的动态数量

在oracle中where 子句和having子句中的区别

SQL中where条件如何判断某个字段有没有

SQL语句update中的where条件的用法问题

要提高SQL查询效率where语句条件的先后次序应如何写