【问题标题】:SQL query case when then in where clauseSQL 查询案例 when then 在 where 子句中
【发布时间】:2019-11-27 12:51:57
【问题描述】:

我阅读了很多类似的问题,但没有找到适合我的解决方案。基本上,只有在特殊条件 (PFSP.EINKAUFS_KZ = 2) 为真时,我才希望有一个 where 子句 (AND PEKP.VORGANGS_ART = 'BE')。

我尝试过很多这样的方法:

SELECT *
FROM PFSP 
LEFT OUTER JOIN PFAK on PFSP.RUECKMELDE_NR = PFAK.RUECKMELDE_NR 
LEFT OUTER JOIN PEKP ON (PFSP.BESTELL_NR=PEKP.VORGANGS_NR) 
                     AND (PFSP.BESTELL_POS_NR=PEKP.VORGANGS_POS_NR) 
LEFT OUTER JOIN PMLB ON PFSP.KOMPONENTEN_ARTIKEL_NR=PMLB.ARTIKEL_NR 
WHERE PFAK.KD_VORGANGS_NR = '910-001213' 
  AND PFSP.RUECKMELDE_STATUS = '3' 
  AND PFSP.BESCHAFFUNGSKENNER = 'F' 
  AND CASE PFSP.EINKAUFS_KZ 
         WHEN 2 THEN PEKP.VORGANGS_ART = 'BE'
       END

但我不断收到错误:

'=' 附近的语法错误

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。你为什么要使用LEFT JOIN,而WHERE 子句只是在撤销它们?
  • 在WHERE 子句中使用AND/OR 构造而不是CASE 表达式通常会更好。
  • 是否涉及空值?

标签: sql where-clause case-when


【解决方案1】:

跳过CASE,改用AND/OR:

AND (PFSP.EINKAUFS_KZ <> 2 OR PEKP.VORGANGS_ART = 'BE')

如果PFSP.EINKAUFS_KZ = 2,则PEKP.VORGANGS_ART 必须等于“BE”。

如果PFSP.EINKAUFS_KZ 2,则PEKP.VORGANGS_ART 是什么无关紧要。

【讨论】:

  • 不错,最短的解决方案。但有点难以理解。
【解决方案2】:

使用这个 CASE 表达式:

AND 1 = CASE  
  WHEN PFSP.EINKAUFS_KZ = 2 AND PEKP.VORGANGS_ART = 'BE' THEN 1 
  WHEN PFSP.EINKAUFS_KZ = 2 THEN 0
  ELSE 1
END

条件的顺序很重要。

【讨论】:

    【解决方案3】:

    你可能想要这样的东西:

    AND (
          (PFSP.EINKAUFS_KZ = 2 AND PEKP.VORGANGS_ART='BE') 
          OR PFSP.EINKAUFS_KZ <> 2 --You may need to catch NULL as well
        )
    

    【讨论】:

      【解决方案4】:
      SELECT *
      FROM PFSP 
      LEFT OUTER JOIN PFAK on PFSP.RUECKMELDE_NR = PFAK.RUECKMELDE_NR 
      LEFT OUTER JOIN PEKP ON (PFSP.BESTELL_NR=PEKP.VORGANGS_NR) 
                           AND (PFSP.BESTELL_POS_NR=PEKP.VORGANGS_POS_NR) 
      LEFT OUTER JOIN PMLB ON PFSP.KOMPONENTEN_ARTIKEL_NR=PMLB.ARTIKEL_NR 
      WHERE PFAK.KD_VORGANGS_NR = '910-001213' 
        AND PFSP.RUECKMELDE_STATUS = '3' 
        AND PFSP.BESCHAFFUNGSKENNER = 'F' 
        AND ((PFSP.EINKAUFS_KZ = 2 AND PEKP.VORGANGS_ART = 'BE') OR (PFSP.EINKAUFS_KZ <> 2)   )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-26
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        • 2011-12-03
        相关资源
        最近更新 更多