然后在where子句中的SQL查询案例

时间:2019-11-27 12:51:57

标签: sql where-clause case-when

我读了很多类似的问题,但没有找到解决方案。基本上,只有在满足特殊条件(where)的情况下,我才希望拥有AND PEKP.VORGANGS_ART = 'BE'子句(PFSP.EINKAUFS_KZ = 2)。

我以多种方式尝试过:

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

但我不断收到错误消息:

  

'='“附近的语法错误

4 个答案:

答案 0 :(得分: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是什么也没关系。

答案 1 :(得分:0)

您可能想要类似的东西:

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

答案 2 :(得分:0)

使用此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 :(得分:0)

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)   )