【问题标题】:How to use case statement in where condition in oracle sql?如何在oracle sql中的where条件中使用case语句?
【发布时间】: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')

标签: sql oracle case-when


【解决方案1】:
(
  (ME<NONME and .... not in (...)) OR
  (ME>NONME and .... not in (...))
)

【讨论】:

【解决方案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
      

      干杯!!

      【讨论】:

        猜你喜欢
        • 2023-01-05
        • 2021-11-12
        • 1970-01-01
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多