Sql 基于多个列值生成选择结果
我有一个Person表,其中有多列显示该人所述的种族(例如非裔美国人、西班牙裔、亚裔、白人等)。允许多选(如白色和亚洲色)。如果选择了特定种族,则列值为1,如果未选择,则列值为0,如果此人完全跳过种族问题,则列值为空 我希望制定一个SELECT查询,该查询将检查多个列,并返回一个文本值,该值是基于值为1的列的字符串连接。也就是说,如果列White为1,列Asian为1,而其他列为0或NULL,则输出为“White/Asian” 一种方法是构建一系列涵盖所有条件组合的IF语句。然而,有8种可能的种族反应,因此如果选择似乎非常笨拙Sql 基于多个列值生成选择结果,sql,tsql,Sql,Tsql,我有一个Person表,其中有多列显示该人所述的种族(例如非裔美国人、西班牙裔、亚裔、白人等)。允许多选(如白色和亚洲色)。如果选择了特定种族,则列值为1,如果未选择,则列值为0,如果此人完全跳过种族问题,则列值为空 我希望制定一个SELECT查询,该查询将检查多个列,并返回一个文本值,该值是基于值为1的列的字符串连接。也就是说,如果列White为1,列Asian为1,而其他列为0或NULL,则输出为“White/Asian” 一种方法是构建一系列涵盖所有条件组合的IF语句。然而,有8种可能的种
这个问题有一个优雅的解决方案吗?假设SQL Server就是这样
select case AfricanAmerican when 1 then 'African American/' else '' end
+ case White when 1 then 'White/' else '' end
+ case Hispanic when 1 then 'Hispanic/' else '' end
from PersonTable
这是一种有效的方法:
ISNULL(
NULLIF(
STUFF(
CASE WHEN AfricanAmerican ='1' THEN 'AfricanAmerican/' ELSE '' END
+ CASE WHEN White='1' THEN 'White/' ELSE '' END
+ CASE WHEN Asian='1' THEN 'Asian' ELSE '' END
, 1, 2, '')
,'')
, '')
As Ethnicity
最好纠正您的标准化。Person
1-n
ethnicity在修复语法错误:-)后,效果非常好,只是它留下了一个尾随“/”,在最常见的情况下,也就是只声明了一个种族。有可能避免吗?@EricJ。尝试用子字符串
封装整个语句,方法如下:子字符串(这里的语句是2400)
如果民族字符串不是空的,那么它会从字符串中去掉第一个'/'
。
-- Some sample data.
declare @Persons as Table ( PersonId Int Identity,
AfricanAmerican Bit Null, Asian Bit Null, Hispanic Bit Null, NativeAmerican Bit Null, White Bit Null );
insert into @Persons ( AfricanAmerican, Asian, Hispanic, NativeAmerican, White ) values
( NULL, NULL, NULL, NULL, NULL ),
( 0, 0, 0, 0, 0 ),
( 1, 0, 0, 0, 0 ),
( 0, 1, 0, 0, 0 ),
( 0, 0, 1, 0, 0 ),
( 0, 0, 0, 1, 0 ),
( 0, 0, 0, 0, 1 ),
( 0, 1, 1, 1, NULL );
-- Display the results.
select PersonId, AfricanAmerican, Asian, Hispanic, NativeAmerican, White,
Substring( Ethnicity, case when Len( Ethnicity ) > 3 then 3 else 1 end,
case when Len( Ethnicity ) > 3 then Len( Ethnicity ) - 2 else 1 end ) as Ethnicity
from (
select PersonId, AfricanAmerican, Asian, Hispanic, NativeAmerican, White,
case when AfricanAmerican = 1 then ' / African American' else '' end +
case when Asian = 1 then ' / Asian' else '' end +
case when Hispanic = 1 then ' / Hispanic' else '' end +
case when NativeAmerican = 1 then ' / Native American' else '' end +
case when White = 1 then ' / White' else '' end as Ethnicity
from @Persons
) as Simone;