SQL ISNULL не работает

Я пытаюсь отобразить 00001, когда результат запроса равен нулю, но запрос по-прежнему возвращает значение null. Я не знаю, что не так с моим запросом.

ИЗМЕНИТЬ:

Предполагая, что OBRNo равно 123-5678-10-13-1619, означает LEN(a.OBRNo) is 19

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) = NULL THEN '00001' ELSE a.OBRNo 
END as CaseWhen, 
ISNULL(a.OBRNo, '00001') as ISNULL,
RIGHT(OBRNo, 5) as OrderBy
FROM tbl_T_BMSCurrentControl as a
WHERE LEN(a.OBRNo) = 20 and a.ActionCode = 1
ORDER BY OrderBy DESC

введите здесь описание изображения


person FrostyPinky    schedule 07.03.2017    source источник
comment
Интересно, как результат NULL соответствует WHERE LEN(a.OBRNo) = 20   -  person devio    schedule 07.03.2017
comment
Я бы сначала убедился, что a.OBRNo не пустая строка   -  person anatol    schedule 07.03.2017
comment
Запрос не возвращает null — он не возвращает ничего. isnull не может создавать строки там, где их нет. И он никогда не сможет вернуть какое-либо нулевое значение a.OBRNo, поскольку вы фильтруете по len(a.OBRNo) = 20, что всегда будет ложным для нулевого значения (и даже если бы это было не так, оно все равно определенно не было бы 20 :)). Возможно, вы захотите проверить, как работают нули в ANSI SQL — это очень важно сделать правильно.   -  person Luaan    schedule 07.03.2017
comment
@Luaan В этом ты прав. Есть ли способ отобразить значение по умолчанию, если это произойдет?   -  person FrostyPinky    schedule 07.03.2017
comment
Пусть ваше приложение справится с этим. SQL на самом деле не подходит для создания отношений там, где их нет :) Это не значит, что это невозможно, но обычно это намного более неуклюже, чем необходимо.   -  person Luaan    schedule 07.03.2017


Ответы (2)


Сравните NULL с IS NULL/IS NOT NULL, а не с = NULL.

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) IS NULL THEN '00001' ELSE a.OBRNo END
...

Вы можете изменить это поведение с помощью SET ANSI_NULLS.

Причина, по которой вы не можете сравнивать с = по умолчанию, заключается в следующем: NULL означает undefined. Ничто не равно неизвестному, даже NULL. Если вы сравните с NULL, результат неизвестен, следовательно, также NULL.

person Tim Schmelter    schedule 07.03.2017
comment
Думаю вопрос про другой случай - ISNULL(a.OBRNo, '00001') as ISNULL - person anatol; 07.03.2017
comment
@anatol Нет, речь идет о непонимании результатов ОП - он не получил ни результатов, ни строки с нулями. Причиной этого является неисправный фильтр, как указывает Тим. - person Luaan; 07.03.2017

Ваш запрос возвращает какую-либо строку?

Ваш ISNULL (x,y) должен делать то, что вы ожидаете, но похоже, что ваш WHERE фильтрует все записи из-за ошибки NULLS.

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

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) = NULL THEN '00001' ELSE a.OBRNo 
END as CaseWhen, 
ISNULL(a.OBRNo, '00001') as ISNULL,
RIGHT(OBRNo, 5) as OrderBy
FROM tbl_T_BMSCurrentControl as a
WHERE (a.OBRNo IS NULL OR LEN(a.OBRNo) = 20) and a.ActionCode = 1
ORDER BY OrderBy DESC

LEN(a.OBRNo), будучи a.OBRNo NULL, будет NULL, поэтому NULL = 20 будет NULL, а NULL AND a.ActionCode = 1 будет NULL, что при фильтрации обрабатывается как FALSE

person Juan    schedule 07.03.2017