SQL Server CASE с объединяющимися столбцами - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь создать столбец, значение которого условно основано на уже указанных столбцах БД.

У меня есть 6 столбцов:

ColumnA
ColumnB
ColumnC
ColumnD
ColumnE
ColumnF 

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

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

CASE
    WHEN ColumnA IS NOT NULL and ColumnB IS NOT NULL
         THEN ColumnA + '-' + ColumnC + '-' + ColumnD + '-' + ColumnB
    WHEN ColumnA IS NOT NULL  and ColumnB IS NULL
         THEN ColumnA + '-' + ColumnC + '-' + ColumnD
    WHEN ColumnE IS NOT NULL
         THEN ColumnE + '-' + ColumnF
END AS CUSTOMCODE

Примечание для данных в этой базе данных, в этом примере ColumnB имеет значение NULL для каждой строки.

Когда этот запрос выполняется, для первой строки, где ColumnA, ColumnC, and ColumnD не равны NULL, он правильно возвращает первый случай, и CUSTOMCODE приводит к ненулевому значению.

Для второй строки, где одинаковые ColumnA, ColumnC, and ColumnD также не равны NULL, он возвращает значение NULL для CUSTOMCODE, и я не уверен, почему.

И как наш бэкэнд структурирован и как поступают данные, тогда, если эти 3 столбца равны нулю, тогда ColumnE and ColumnF are not null, однако для строк, где это имеет место, это также приводит к тому, что CUSTOMCODE равен NULL.

Есть ли что-то, чего мне не хватает в CASE Statement, или мне нужно реструктурировать это или сделать что-то еще?

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Кажется, проще всего обернуть их все в IS NULL

select isnull(ColumnA,'') + isnull(ColumnB,'') + isnull(ColumnC,'') ...etc

Если это не то, чего вы действительно хотите, вам следует помнить, что оператор CASE завершится, как только первое условие будет для меня. Таким образом, порядок вашего CASE имеет значение.

Например, последние CASE, WHEN ColumnE IS NOT NULL могут никогда не встретиться, потому что в первых двух CASE это также может быть TRUE.

Примечание для данных в этой базе данных, в этом примере ColumnB имеет значение NULL за каждый ряд.

Если это так, то третий CASE никогда не произойдет, если ColumnA не NULL, так как второй CASE равен WHEN ColumnA IS NOT NULL and ColumnB IS NULL.

Для второй строки, где одинаковые ColumnA, ColumnC и ColumnD также не равны NULL, он возвращает значение NULL для CUSTOMCODE, и я не уверен, почему.

Это определенно не произойдет с кодом, который вы предоставили. Но важно понимать, что NULL и пустое пространство - это не одно и то же. то есть select 'true' where NULL = '' никогда не будет правдой.

Наконец, помните, что что-нибудь + NULL = NULL. то есть select 1 + NULL вернется NULL

0 голосов
/ 07 ноября 2018

Я думаю, что вы хотите:

select stuff( coalesce('-' + columna, '') +
              coalesce('-' + columnb, '') +
              coalesce('-' + columnc, '') +
              coalesce('-' + columnd, '') +
              coalesce('-' + columne, '') +
              coalesce('-' + columnf, ''), 1, 1, ''
             ) as concatenated_together_with_hyphen

Это эквивалент concat_ws() в других базах данных.

0 голосов
/ 07 ноября 2018

Я не очень разбираюсь в вашей логике, но, насколько я понимаю, вы не проверяете значение NULL для столбцов ColumnC, ColumnD и ColumnF, если один из них NULL, ваше поле CUSTOMCODE будет NULL

Попробуйте это:

CASE
    WHEN ColumnA IS NOT NULL and ColumnB IS NOT NULL
        THEN ColumnA + '-' + ISNULL(ColumnC, '') + '-' + ISNULL(ColumnD, '') + '-' + ColumnB
    WHEN ColumnA IS NOT NULL  and ColumnB IS NULL
        THEN ColumnA + '-' + ISNULL(ColumnC, '') + '-' + ISNULL(ColumnD, '')
    WHEN ColumnE IS NOT NULL
        THEN ColumnE + '-' + ISNULL(ColumnF, '')
END AS CUSTOMCODE

Хотя я бы порекомендовал проверить логику вашего сценария, возможно, вы могли бы сделать то же самое только с ISNULL() (?)

...