将CASE与来自多个表的条件一起使用

时间:2019-11-21 19:00:27

标签: sql

我必须进行选择查询才能创建具有特定条件的视图。

我有多个表,其中包含许多列和行。

但是,我提取了一个值用作我的键(例如:id)。我使用函数UNION从所有表中提取了7000多个唯一键,以避免重复。

现在,我想添加一列INDICATOR_1,它将根据条件影响值YES或NO。

这是我挣扎的地方。

我需要在那些包含ID的表中找到该行。之后,我想一直在那一行检查XYZ字段是否包含值“ N”(示例)。如果是,请影响INDICATOR_1的值为“是”,否则为否。

就伪代码而言,我想做的事情看起来像这样:

CASE
    WHEN id = (id from table_1) AND (if table_1.xyz = 'N') 
       THEN 'YES'
       ELSE 'NO'
END AS INDICATOR_1

我不清楚我是否足够清楚,但是您的帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果我的理解正确,那么您希望每个表都有一个单独的指示器。像这样:

select i.*,
       (case when exists (select 1
                          from table1 t1
                          where t1.id = i.id and t1.xyz = 'N'
                         )
             then 'YES' else 'NO'
        end) as indicator_1,
       (case when exists (select 1
                          from table2 t2
                          where t2.id = i.id and t2.xyz = 'N'
                         )
             then 'YES' else 'NO'
        end) as indicator_2,
       . . .
from (<your id list here>) i

答案 1 :(得分:0)

我认为您应该在联合中解决此问题,在联合中您拥有所有需要的数据。你可能有类似的东西:

SELECT Id
FROM table_1

UNION

SELECT Id
FROM table_2

如何也选择所需的信息(我在这里使用distinct进行澄清):

SELECT DISTINCT Id
,      CASE WHEN table_1.xyz = 'N' THEN 'N' 
            ELSE 'Y' 
       END INDICATOR_1
FROM   table_1

如果id可以同时存在两种口味的记录,则这可能导致比您拥有的记录更多。我们可以在外部查询中使用行号来解决该问题。您最终会得到类似的东西:

SELECT Id
,      INDICATOR_1
FROM   (
         SELECT Id
         ,      INDICATOR_1
         ,      ROW_NUMBER()OVER(PARTITION BY ID ORDER BY CASE WHEN INDICATOR_1 ='N' THEN 0 ELSE 1 END) RN
         FROM   (
                  SELECT Id
                  ,      CASE WHEN table_1.xyz = 'N' THEN 'N' 
                              ELSE 'Y' 
                         END INDICATOR_1
                  FROM   table_1
                  UNION
                  ... 
                ) T
       ) S
WHERE S.RN = 1

您实际上可以通过在ROW_NUMBER表达式中使用最里面的case表达式来缩短它。