【问题标题】:Build select result based on multiple column values基于多列值构建选择结果
【发布时间】:2013-11-22 02:56:48
【问题描述】:

我有一个 Person 表,其中包含多个列,指示此人声明的种族(例如非裔美国人、西班牙裔、亚洲人、白人等)。允许多项选择(例如白人和亚洲人)。如果选择了特定种族,则列值为 1,如果未选择,则为 0,如果此人完全跳过种族问题,则为 NULL。

我希望制定一个 SELECT 查询,该查询将检查多个 Ethnicity 列并返回单个文本值,该值是基于值为 1 的列的字符串连接。也就是说,如果 White 列是 1,Asian 列为 1,其他列为 0 或 NULL,输出将是“白人/亚洲人”。

一种方法是构建一系列涵盖所有条件组合的 IF 语句。但是,有 8 种可能的种族响应,因此 IF 选项似乎非常笨拙。

这个问题有什么优雅的解决方案吗?

【问题讨论】:

  • 最好纠正你的规范化。人1-n种族

标签: sql tsql


【解决方案1】:

假设 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

【讨论】:

  • 在修复语法错误之后 :-) 效果很好,除了它在最常见的情况下也留下一个尾随的“/”,即只声明了一个种族。有没有可能避免这种情况?
  • @EricJ。尝试用SUBSTRING这样封装整个语句:SUBSTRING(statement goes here, 2, 4000)
【解决方案2】:

这是一种有效的方法:

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

【讨论】:

    【解决方案3】:
    -- 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;
    

    【讨论】:

    • 如果种族字符串不为空,则从字符串中删除第一个' / '
    猜你喜欢
    • 2019-04-10
    • 2016-02-25
    • 1970-01-01
    • 2015-02-15
    • 2018-03-09
    • 2020-02-05
    • 2021-09-18
    • 2018-08-24
    • 1970-01-01
    相关资源
    最近更新 更多