Выражение CASE для условия NULL не работает - PullRequest
0 голосов
/ 28 марта 2019

У меня есть SQL-запрос, где выражение case не работает, потому что я получаю значение NULL.

Есть идеи, как это исправить?

select 
td.reportEndDate,
    CASE td.originalLinearAirDate
    WHEN NULL THEN '12345678'
    END As originalLinearAirDate
from 
FROM DBA.Telecast td 
where id = 2
order by
td.reportEndDate,
originalLinearAirDate;

Ответы [ 3 ]

0 голосов
/ 28 марта 2019

Вы можете использовать isnull

select 
td.reportEndDate,
    CASE WHEN td.originalLinearAirDate IS NULL THEN '19000101'
         ELSE td.originalLinearAirDate 
    END As originalLinearAirDate
from 
FROM DBA.Telecast td 
where id = 2
order by
td.reportEndDate,
originalLinearAirDate;
0 голосов
/ 28 марта 2019

Проблема в сравнении NULL. Сравнение никогда не выполняется, даже если используется из сравнения в выражении CASE.

Если вы хотите сделать это с помощью CASE, то вам нужно использовать IS NULL:

(CASE WHEN td.originalLinearAirDate IS NULL
      THEN '12345678'
 END) As originalLinearAirDate

Если вы хотите вернуть исходное значение в этом случае, вам нужно ELSE:

(CASE WHEN td.originalLinearAirDate IS NULL
      THEN '12345678'
      ELSE td.originalLinearAirDate 
 END) As originalLinearAirDate

Обратите внимание, что это вернет ошибку, если столбец действительно DATE, потому что '12345678' нельзя преобразовать в дату.

Эту версию лучше выразить, используя COALESCE():

COALESCE(td.originalLinearAirDate, '12345678')
0 голосов
/ 28 марта 2019

Вы можете использовать COALESCE():

SELECT td.reportEndDate, 
       COALESCE(td.originalLinearAirDate, '12345678') AS originalLinearAirDate -- Use default date instead of '12345678'
FROM DBA.Telecast td 
WHERE id = 2
ORDER BY td.reportEndDate, originalLinearAirDate;

В своем выражении case вы не указали ELSE часть, следовательно, вы получили NULL.

Однако выражение case вернет только один тип. Итак, вы должны проверить код или сделать необходимый разговор.

...