2013-11-22 36 views
1

我有一個Person表,其中有多列,指示該人員的種族(例如非洲裔美國人,西班牙裔,亞洲人,白人等)。可以選擇多個選項(例如白色和亞洲)。如果選擇一個特定種族,則列值爲1,如果未選擇則爲0,如果該人完全跳過種族問題,則爲NULL。根據多個列值構建選擇結果

我想制定一個SELECT查詢,它將檢查多個種族列,並返回基於值爲1的列的字符串連接的單個文本值。也就是說,如果列White爲1,並且列亞洲是1,其他列是0或NULL,輸出將是'白色/亞洲'。

一種方法是構建一系列覆蓋所有條件組合的IF語句。但是,有8種可能的種族反應,因此IF選項似乎非常笨拙。

有沒有一個優雅的解決方案來解決這個問題?

+0

這將是更好地糾正你的正常化。人'1-n'種族 –

+0

沒有選項... –

回答

2

假設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 
+0

修復了語法錯誤:-)後,工作得很好,除了在最常見的情況下只留下了一個種族的尾部'/'。有沒有可能避免這種情況? –

+0

@EricJ。嘗試用'SUBSTRING'封裝整個語句:'SUBSTRING(語句在這裏,2,4000)' – gotqn

0

這是做它的有效方法:

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 
0
-- 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; 
+0

我不關注你在做什麼測試種族的長度> 3 ... –

+0

如果種族字符串不是空的,它從字符串中除去第一個「/」。 – HABO