具有多个结果的案例表达

时间:2017-05-09 14:15:15

标签: sql case

我正在寻找一种方法来实际在MS SQL Server中的结果中创建一些重复。我知道通常你正在寻找不创建重复的方法,但在这个例子中我需要返回所有单独的行。

我正在使用一个包含大约1000万行和33列的表。该表由第一列中的ID组成,其余列具有“' Y'或者' NULL'在它们中 - 大多数列都是NULL。

在1000万行中,其中800万只只有一个“Y'每行剩余的200万行,其中有一列以及一个' Y'连续。

对于单个' Y'一个基本的case表达式可以很好地创建一列结果。

这是我的问题 - 我想要两行,每行一个' Y'如果有多个' Y'连续。

下面是一个小的去识别样本。

ID        FLAG1   FLAG2         FLAG3       FLAG4   FLAG5
188       NULL    NULL          NULL        NULL    NULL
194       Y       NULL          NULL        NULL    NULL
200       Y       NULL          NULL        NULL    Y

我试图像这样使用Case Expression。

Select 
ID
,Case 
    When [FLAG1] = 'Y'
    Then 'FLAG1'
    When [FLAG2] = 'Y'
    Then 'FLAG2'      
End as 'Service_Line'

我想要的是一个看起来像这样的结果。

ID     Service_Line
194    FLAG1
200    FLAG1
200    FLAG5

我的问题是Case表达式只返回第一个结果,所以我最终得到了这个结果。

ID     Service_Line
194    FLAG1
200    FLAG1

案例表达是否适合我想要完成的事情,或者我应该尝试以其他方式解决这个问题?

1 个答案:

答案 0 :(得分:0)

case不合适。一般的SQL方法是:

select id, 'FLAG1' as flag
from t
where flag1 = 'Y'
union all
select id, 'FLAG2' as flag
from t
where flag2 = 'Y'
union all
select id, 'FLAG3' as flag
from t
where flag3 = 'Y'
. . .

还有其他(更有效的)方法,但这些方法取决于您使用的数据库。

我应该注意:如果您希望将值放在一行中,case是正确的方法:

select id,
       concat( case when flag1 = 'Y' then 'FLAG1 ' else '' end,
               case when flag2 = 'Y' then 'FLAG2 ' else '' end,
               case when flag3 = 'Y' then 'FLAG3 ' else '' end,
               . . .
             ) as flags
from t;

当然,concat()的语法可能因数据库而异(concat()本身是ANSI标准)。你也可以修剪掉最后一个空格。