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

enter image description here

Данные испытаний

CREATE TABLE [dbo].[testbit](
    [StaffId] [int] NULL,
    [type1] [bit] NOT NULL,
    [type2] [bit] NULL,
    [type3] [bit] NULL,
    [type4] [bit] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[testbit] ([StaffId], [type1], [type2], [type3], [type4]) VALUES (1, 1, 0, 0, 1)
GO
INSERT [dbo].[testbit] ([StaffId], [type1], [type2], [type3], [type4]) VALUES (2, 0, 1, 0, 0)
GO
INSERT [dbo].[testbit] ([StaffId], [type1], [type2], [type3], [type4]) VALUES (3, 1, 1, 1, 1)
GO
0
Philip 21 Дек 2019 в 06:42

1 ответ

Лучший ответ

Используйте выражение CASE WHEN <expr> или CASE <expr> WHEN <value>, затем объедините во внешнем запросе с CONCAT_WS.

  • Выражение CASE оценивается как NULL, когда регистр ELSE опущен, поэтому эти выражения эквивалентны:

    CASE x WHEN 1 THEN 'foo' END
    CASE x WHEN 1 THEN 'foo' ELSE NULL END
    CASE WHEN x = 1 THEN 'foo' END
    CASE WHEN x = 1 THEN 'foo' ELSE NULL END
    
  • Функция CONCAT_WS является переменной и объединяет ненулевые строки со строкой-разделителем (первым аргументом).

    CONCAT_WS( ', ', 'a', 'b', NULL, NULL, 'c' ) == 'a, b, c'
    

Вот как бы я это сделал:

SELECT
    StaffId,
    CONCAT_WS( ', ', Type1Text, Type2Text, Type3Text, Type4Text ) AS TypeNames
FROM
    (
        SELECT
            StaffId,
            CASE type1 WHEN 1 THEN 'Type1Name' END AS Type1Text,
            CASE type2 WHEN 1 THEN 'Type2Name' END AS Type2Text,
            CASE type2 WHEN 1 THEN 'Type3Name' END AS Type3Text,
            CASE type3 WHEN 1 THEN 'Type4Name' END AS Type4Text
        FROM
            ...
    ) AS iq

Внешний запрос можно опустить, если вы не против сделать его немного сложнее для чтения:

SELECT
    StaffId,
    CONCAT_WS( ', ',
        CASE type1 WHEN 1 THEN 'Type1Name' END AS Type1Text,
        CASE type2 WHEN 1 THEN 'Type2Name' END AS Type2Text,
        CASE type2 WHEN 1 THEN 'Type3Name' END AS Type3Text,
        CASE type3 WHEN 1 THEN 'Type4Name' END AS Type4Text
    ) AS TypeNames
FROM
    ...
4
Dai 21 Дек 2019 в 05:59