Sql 基于多个列值生成选择结果

Sql 基于多个列值生成选择结果,sql,tsql,Sql,Tsql,我有一个Person表,其中有多列显示该人所述的种族(例如非裔美国人、西班牙裔、亚裔、白人等)。允许多选(如白色和亚洲色)。如果选择了特定种族,则列值为1,如果未选择,则列值为0,如果此人完全跳过种族问题,则列值为空 我希望制定一个SELECT查询,该查询将检查多个列,并返回一个文本值,该值是基于值为1的列的字符串连接。也就是说,如果列White为1,列Asian为1,而其他列为0或NULL,则输出为“White/Asian” 一种方法是构建一系列涵盖所有条件组合的IF语句。然而,有8种可能的种

我有一个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;