基于多列值构建选择结果
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;
【讨论】:
如果种族字符串不为空,则从字符串中删除第一个' / '
。以上是关于基于多列值构建选择结果的主要内容,如果未能解决你的问题,请参考以下文章
使用 R 如何删除基于多列的重复项,但选择重复项的“最完整”版本
Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列dataframe(不设置参数n则列表长度不同较短的列表会出现缺失值)