Sql 具有多个结果的Case表达式
我正在寻找一种在MS SQL Server中实际创建一些重复结果的方法。我知道您通常在寻找不创建重复的方法,但在本例中,我需要返回所有单独的行 我正在处理一个大约有1000万行和33列的表。该表由第一列中的ID组成,其余列中的ID为“Y”或“NULL”-绝大多数列为NULL 在1000万行中,有800万行每行只有一个“Y”,其余200万行每行有多个“Y”列 对于具有单个“Y”的行,基本大小写表达式可以很好地创建一列结果 这是我的问题-我想要两行,如果一行中有多个“Y”,那么每个“Y”对应一行 下面是一个小样本Sql 具有多个结果的Case表达式,sql,case,Sql,Case,我正在寻找一种在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?感谢您的回复,但这会导致在一个单元格中出现这两个项目。我正在为每个项目寻找一行,而不是将它们连接到单个单元格中。不过,您的第一个选项似乎有效。我将用最新信息返回。感谢您的回复,但这将导致在一个单元格中显示这两个项目。我正在为每个项目寻找一行,而不是将它们连接到单个单元格中。不过,您的第一个选项似乎有效。我会带着最新消息返回。