SQL 中的 IF/Case 语句

IF / Case statment in SQL

我有一列有 0 或 1。我喜欢进行以下设置:

If 0 than put / use the Region_table (here I have regions like EMEA, AP, LA with only goods) and when it 1 then put / use the Plant_table(这里我有生产非成品的工厂)数据。

我试着用 2 个不同的语句来写,但效果不好:

,Case 

when [FG_NFG_Selektion]  = '0'  Then 'AC_region' 

End as 'AC_region' 

,Case

when [FG_NFG_Selektion]  = '1'  Then 'AC_plant'

End as 'AC_plant'

我不是 100% 清楚你在找什么,但如果你想根据 [FG_NFG_Selektion] 字段中的值从不同的表中获取数据,你可以这样做:

SELECT 
  CASE 
    WHEN [FG_NFG_Selektion] = '0' THEN r.some_col -- If 0, use value from "region" table
    WHEN [FG_NFG_Selektion] = '1' THEN p.some_col -- If 1, use value from "plant" table
  END AS new_field
FROM MyTable t
LEFT JOIN AC_region r ON t.pk_col = r.pk_col -- get data from "AC_region" table
LEFT JOIN AC_plant p ON t.pk_col = p.pk_col -- get data from "AC_plant" table
;

如果 [FG_NFG_Selektion] 是数字字段,则应删除单引号:[FG_NFG_Selektion] = 0.

我强烈建议将条件放在 ON 子句中:

SELECT COALESCE(r.some_col, p.some_col) as som_col
FROM t LEFT JOIN
     AC_region r
     ON t.pk_col = r.pk_col AND
        t.FG_NFG_Selektion = '0' LEFT JOIN
     AC_plant p
     ON t.pk_col = p.pk_col AND
        t.FG_NFG_Selektion = '1';

我为什么推荐这个?首先,如果 table 中有多个匹配项,这将正常工作。在这种情况下,这可能不是问题,但在其他情况下可能是问题。你不想弄清楚额外的行来自哪里。

其次,将条件放在 ON 子句中允许 optimizer/execution 引擎利用它们。例如,在索引中更可能使用 FG_NFG_Selektion