Oracle SQL的Where子句中如何写case语句?

Posted

技术标签:

【中文标题】Oracle SQL的Where子句中如何写case语句?【英文标题】:How to write a case statement in the Where clause of Oracle SQL? 【发布时间】:2020-12-14 09:48:58 【问题描述】:

请告诉我这个问题。

TABLE:PPP
+-------+---------+---------+----------+
|No     |  Flag_A | Flag_B  |   Qty    |
+-------+---------+---------+----------+
|100    |    P    |    0    |    10    |
|300    |    B    |    1    |    20    |
|500    |    C    |    0    |    30    |
|100    |    P    |    0    |    40    |
|100    |    P    |    0    |    50    |
|300    |    B    |    1    |    60    |
|500    |    C    |    1    |    70    |
|100    |    P    |    0    |    80    |
|500    |    B    |    2    |    90    |
+-------+---------+---------+----------+

SELECT NO, SUM(QTY) AS QTY 
  FROM PPP
 WHERE 
   CASE FLAG_B IN (
     WHEN FLAG_A = 'P' THEN '0'
     WHEN FLAG_A = 'C' THEN '1'
     WHEN FLAG_A = 'B' THEN '0' , '1' <- how to write? 
    END
   )
GROUP BY NO

我想得到这个结果。

+----+-----+
| No | Qty | 
+----+-----+
| 100|  180|
| 300|   80|
| 500|  100|
+----+-----+

sql应该写什么?

【问题讨论】:

No=500 似乎不可能得到 Qty=100 ... 奇怪的是,名为“flag”的列的值是“2”。 【参考方案1】:

用布尔逻辑来表述会更简单:

where (flag_a = 'P' and flag_b = 0)
   or (flag_a = 'C' and flag_b = 1)
   or (flag_a = 'B' and flag_b in (0, 1))

我们可以分解一下:

where (flag_a in ('B', 'P') and flag_b = 0)
   or (flag_a in ('B', 'C') and flag_b = 1)

或者我们可以使用元组相等:

where (flag_a, flag_b) in (('P', 0), ('C', 1), ('B', 0), ('B', 1))

flag_b 看起来像一个数字,所以我将它与文字数字进行了比较;如果这确实是一个字符串,那么您可以在文字周围添加单引号。

【讨论】:

我真的很抱歉这么晚才回复。我试过了,它奏效了!非常感谢!! 欢迎@piyo_lune。如果我的回答正确回答了您的问题,请点击复选标志accept it。谢谢。【参考方案2】:

flag_a='B' 的情况使用包含CASE..WHEN 表达式的DECODE() 函数可能是获得所需结果的另一种方法,例如

SELECT no, SUM(qty) AS qty
  FROM ppp
 WHERE DECODE(flag_a,'P',0,'C',1,'B', CASE WHEN flag_b IN (0,1) THEN flag_b END)=flag_b
 GROUP BY no

Demo

P.S:我认为 No=500 的数据存在问题,需要修复。

【讨论】:

以上是关于Oracle SQL的Where子句中如何写case语句?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 形式:pl/sql 中 where 子句中的 max 子句

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

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

Oracle初级优化sql

如何使用带有过滤器 where 子句的 oracle 外连接

如何在 oracle sql 数据库中使 WHERE 子句不区分大小写?