【问题标题】:DB2: How to filter based on the result obtained from CASE conditionDB2:如何根据从 CASE 条件获得的结果进行过滤
【发布时间】:2018-10-18 20:36:50
【问题描述】:

我正在尝试根据 DB2 中先前 CASE 条件获得的结果过滤数据:

下面是过滤数据的初始查询:

SELECT EM.NAME,EM.ID,EM.DIV
CASE DEPT
WHEN '1' THEN 'FIN'
WHEN '2' THEN 'MKT'
WHEN '3' THEN 'IT'
WHEN '4' THEN 'HR' END AS DEPT_DESC
FROM EMPLOYEE_RCD EM;

样本数据:

NAME    ID    DIV   DEPT_DESC
MICHAEL 3334   3    IT
SAMUEL  100922 1    FIN
ORINDA  7363   1    FIN
SARA    8383   2    MKT
RACHAEL 8383   4    HR
MARTIN  33312  
SUZY    993    NA   NA
MIKE    576    NULL NULL

我试图过滤的结果:

SELECT EM.NAME,EM.ID,EM.DIV
CASE DEPT
WHEN '1' THEN 'FIN'
WHEN '2' THEN 'MKT'
WHEN '3' THEN 'IT'
WHEN '4' THEN 'HR' END AS DEPT_DESC
CASE DEPT_DESC
WHEN DEPT_DESC == ''   THEN 'No Dept'
WHEN DEPT_DESC == NA   THEN 'No Dept'
WHEN DEPT_DESC == NULL THEN 'No Dept'
FROM EMPLOYEE_RCD EM;

但没有得到结果反而得到错误:

[Code: -104, SQL State: 42601]  An unexpected token "== ''" was found following "WHEN DEPT_DESC".  Expected tokens may include:  "<space>".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.22.29

任何帮助,如何过滤数据并获得以下结果:

预期 0/P:

NAME    ID    DIV   DEPT_DESC
MARTIN  33312  
SUZY    993    NA   NA
MIKE    576    NULL NULL

【问题讨论】:

    标签: sql database db2


    【解决方案1】:

    你用错了CASE

    • 每个WHEN 子句都需要后跟一个[boolean] 条件。
    • 使用单等号= 表示相等,而不是双等号==
    • 如果您想使用预先计算的列再次对其进行处理,您可以使用子查询。

    您的查询应该如下所示:

    select name, id, div,
        CASE
        WHEN DEPT_DESC = ''   THEN 'No Dept'
        WHEN DEPT_DESC = NA   THEN 'No Dept'
        WHEN DEPT_DESC = NULL THEN 'No Dept'
        END as dept_desc
      from ( -- subquery runs first
        SELECT EM.NAME,EM.ID,EM.DIV
        CASE 
        WHEN DIV = '1' THEN 'FIN'
        WHEN DIV = '2' THEN 'MKT'
        WHEN DIV = '3' THEN 'IT'
        WHEN DIV = '4' THEN 'HR' END AS DEPT_DESC
        FROM EMPLOYEE_RCD EM
      ) x    
    ;
    

    【讨论】:

    • CASE colname WHEN value1 THEN expression1 WHEN value2 THEN expression2 ...CASE 的有效形式,但不常用且限制性更强
    • @PaulVernon 哦。你每天学习新的东西。感谢您的澄清。
    • 但否则,你是对的,使用子查询是这里的方法。除非您使用 SQL_COMPT=NPS,您可以稍后在同一个选择列表中引用先前计算的列或别名,但实际上这只是为了与 Netezza 兼容
    【解决方案2】:

    在给出的例子中,你只需要一个case语句

    SELECT  EM.NAME
    ,       EM.ID
    ,       EM.DIV
    ,       CASE DEPT
                WHEN '1' THEN 'FIN'
                WHEN '2' THEN 'MKT'
                WHEN '3' THEN 'IT'
                WHEN '4' THEN 'HR' 
                         ELSE 'No Dept' END AS DEPT_DESC
    FROM
        EMPLOYEE_RCD EM
    

    顺便说一句,如果您使用可以在编写 SQL 时对其进行解析的 SQL 编辑器(例如免费的 IBM Data Studio),则更容易发现和修复语法错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-08
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多