Использование ISNULL () для результата выражения case - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть большое регистровое выражение

например,

CASE WHEN ... THEN ... ELSE
CASE WHEN ... THEN ... ELSE '' END ELSE '' END +
CASE WHEN ... THEN ... ELSE
CASE WHEN ... THEN ... ELSE '' END ELSE '' END as [Test]

Теперь столбец [Test] возвращает несколько NULLS.Как я могу обернуть это выражение CASE (ISNULL, ''), чтобы, если оно было NULL, оно было просто пустым?

Каков самый чистый способ выполнить это с очень большой инструкцией case?

Ответы [ 4 ]

0 голосов
/ 19 сентября 2018

Я думаю, что лучший способ - использовать функцию для большого оператора case, это будет более читабельным для вас.И проще реализовать ваши решения.

0 голосов
/ 19 сентября 2018

Я бы сделал:

SELECT ISNULL([Test], '')
FROM table t CROSS APPLY
     ( VALUES (CASE WHEN ... THEN ... ELSE
               CASE WHEN ... THEN ... ELSE '' END ELSE '' END +
               CASE WHEN ... THEN ... ELSE
               CASE WHEN ... THEN ... ELSE '' END ELSE '' END)
     ) tt ([Test]);

Однако вы также можете применить ISNULL() ко всему огромному выражению регистра:

SELECT ISNULL((CASE WHEN ... THEN ... ELSE
               CASE WHEN ... THEN ... ELSE '' END ELSE '' END +
               CASE WHEN ... THEN ... ELSE
               CASE WHEN ... THEN ... ELSE '' END ELSE '' END), ''
              )
. . . 

Единственное преимущество APPLY состоит в том, что выможно использовать столбец [Test] в любом месте или более одного раза.

0 голосов
/ 19 сентября 2018

Возможно, я упускаю суть, но есть что-то, что вам не нравится в

ISNULL(
    CASE WHEN ... THEN ... ELSE
    CASE WHEN ... THEN ... ELSE '' END ELSE '' END +
    CASE WHEN ... THEN ... ELSE
    CASE WHEN ... THEN ... ELSE '' END ELSE '' END 
    , '')
AS [Test]

?

0 голосов
/ 19 сентября 2018

Просто оберните все выражение с помощью ISNULL:

ISNULL(
CASE WHEN ... THEN ... ELSE
CASE WHEN ... THEN ... ELSE '' END ELSE '' END +
CASE WHEN ... THEN ... ELSE
CASE WHEN ... THEN ... ELSE '' END ELSE '' END,'') as [Test]

В качестве альтернативы, вы можете использовать CONCAT, однако это немного изменит логику вашего запроса.Если одно выражение не вернуло NULL, а другое вернуло, теперь вы получите значение.NULL + {Non NULL Expression} = NULL однако CONCAT(NULL,{Non NULL Expression}) = {Non NULL Expression}.:

CONCAT(
CASE WHEN ... THEN ... ELSE
CASE WHEN ... THEN ... ELSE '' END ELSE '' END,
CASE WHEN ... THEN ... ELSE
CASE WHEN ... THEN ... ELSE '' END ELSE '' END) as [Test]

CONCAT никогда не вернется NULL.Если каждое выражение имеет значение NULL, возвращается пустая строка ((n)varchar).

...