2013-11-22 2 views
1

У меня есть таблица Person с несколькими столбцами, обозначающая указанную этническую принадлежность человека (например, афро-американец, испаноязычный, азиатский, белый и т. Д.). Разрешены множественные выборы (например, белый и азиатский). Если выбрана определенная этническая принадлежность, значение столбца равно 1, если оно не выбрано, оно равно 0, и если человек полностью пропустил вопрос об этнической принадлежности, он равен NULL.Результат выбора сборки, основанный на значениях нескольких столбцов

Я хочу сформулировать запрос SELECT, который будет рассматривать несколько столбцов «Этничность» и вернуть одно текстовое значение, которое представляет собой конкатенацию строк на основе столбцов, значения которых равны 1. То есть, если столбец «Белый» равен 1 и столбцу Азиатский - 1, а остальные столбцы равны 0 или NULL, выход будет «Белый/Азиатский».

Один из подходов состоит в том, чтобы построить ряд операторов IF, которые охватывают все комбинации условий. Однако существует 8 возможных ответов на этническую принадлежность, поэтому вариант IF представляется очень громоздким.

Есть ли элегантное решение этой проблемы?

+0

Было бы лучше, чтобы исправить нормализацию. Person '1-n' Ethnicity –

+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

Смежные вопросы