Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有多个结果的Case表达式_Sql_Case - Fatal编程技术网

Sql 具有多个结果的Case表达式

Sql 具有多个结果的Case表达式,sql,case,Sql,Case,我正在寻找一种在MS SQL Server中实际创建一些重复结果的方法。我知道您通常在寻找不创建重复的方法,但在本例中,我需要返回所有单独的行 我正在处理一个大约有1000万行和33列的表。该表由第一列中的ID组成,其余列中的ID为“Y”或“NULL”-绝大多数列为NULL 在1000万行中,有800万行每行只有一个“Y”,其余200万行每行有多个“Y”列 对于具有单个“Y”的行,基本大小写表达式可以很好地创建一列结果 这是我的问题-我想要两行,如果一行中有多个“Y”,那么每个“Y”对应一行 下

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

我正在处理一个大约有1000万行和33列的表。该表由第一列中的ID组成,其余列中的ID为“Y”或“NULL”-绝大多数列为NULL

在1000万行中,有800万行每行只有一个“Y”,其余200万行每行有多个“Y”列

对于具有单个“Y”的行,基本大小写表达式可以很好地创建一列结果

这是我的问题-我想要两行,如果一行中有多个“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表达式

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
我想要的是这样的结果

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

一个Case表达式是否适合于我试图完成的任务,或者我是否应该尝试以其他方式来实现这一点?

一个
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标准)。您还可以删除最后一个空格。

不适合使用
大小写。一般的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标准)。您还可以删除最后一个空格。

您使用的数据库系统是什么(MySQL、PostgreSQL、Oracle、MS SQL Server等)?这可能会改变您可用的功能,以优雅的方式解决此类问题。编辑您的问题并指定您正在使用的数据库。检查您的RDBMS是否支持UNPIVOT。我也在调查UNPIVOT,我曾在其他场景中使用过,但由于某些原因,我无法将其适当地应用于此数据,原因可能是用户错误。您仍然没有告诉我们您的rdbms。Sql Server、MySql、Postgres?您使用的数据库系统是什么(MySql、PostgreSQL、Oracle、MS Sql Server等)?这可能会改变您可用的功能,以优雅的方式解决此类问题。编辑您的问题并指定您正在使用的数据库。检查您的RDBMS是否支持UNPIVOT。我也在调查UNPIVOT,我曾在其他场景中使用过,但由于某些原因,我无法将其适当地应用于此数据,原因可能是用户错误。您仍然没有告诉我们您的rdbms。Sql Server、MySql、Postgres?感谢您的回复,但这会导致在一个单元格中出现这两个项目。我正在为每个项目寻找一行,而不是将它们连接到单个单元格中。不过,您的第一个选项似乎有效。我将用最新信息返回。感谢您的回复,但这将导致在一个单元格中显示这两个项目。我正在为每个项目寻找一行,而不是将它们连接到单个单元格中。不过,您的第一个选项似乎有效。我会带着最新消息返回。