基于多列值构建选择结果

Posted

技术标签:

【中文标题】基于多列值构建选择结果【英文标题】: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种族 【参考方案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;

【讨论】:

如果种族字符串不为空,则从字符串中删除第一个' / '

以上是关于基于多列值构建选择结果的主要内容,如果未能解决你的问题,请参考以下文章

Vba 到基于多列的自动过滤器

使用 R 如何删除基于多列的重复项,但选择重复项的“最完整”版本

从多列中选择最小值的最佳方法是什么?

多列comboBox但是当选择值时应该是Id

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列dataframe(不设置参数n则列表长度不同较短的列表会出现缺失值)

基于多列值映射值和合并数据框