функция isnull в предложении WHERE

Я пытаюсь исправить проблему в хранимой процедуре и столкнулся с проблемой, которая меня беспокоит.

По сути, isnull работает, как ожидалось, для одной записи в T0, но не для другой, где T0.FatherCard равны NULL. Я не понимаю почему.

SELECT *
FROM OINV T0
WHERE ISNULL(T0.FatherCard, T0.CardCode) = 'C0189'

Как и ожидалось, возвращает полную строку данных.

SELECT *
FROM OINV T0
WHERE ISNULL(T0.FatherCard, T0.CardCode) = 'C0817'

Ничего не возвращает. Я ожидаю полного ряда данных.

В обоих случаях FatherCard = NULL

CardCode    FatherCard  Table
------------------------------
C0189       NULL        OINV
C0817       NULL        OINV

FatherCard и CardCode имеют одинаковый тип (nvarchar) и длину (50).

Если я удалю функцию ISNULL и просто выберу WHERE T0.CardCode = C0817, она будет работать должным образом.

Возможно ли, что T0.FatherCard на самом деле не NULL для целей оценки ISNULL и возвращает какое-то другое значение?


person nickc    schedule 04.11.2016    source источник
comment
Это NULL, как в случае с нулевым значением, или NULL, как в текстовой строке NULL?   -  person shree.pat18    schedule 04.11.2016
comment
Пожалуйста, запустите SELECT *, isnull(T0.FatherCard,T0.CardCode) FROM OINV T0 и опубликуйте, что вы получили   -  person Niyoko    schedule 04.11.2016
comment
@ shree.pat18 - это значение NULL.   -  person nickc    schedule 04.11.2016
comment
@NiyokoYuliawan - Я могу это сделать, но таблица результатов огромна. Вы ищете полную строку из каждой записи для сравнения?   -  person nickc    schedule 04.11.2016
comment
@ shree.pat18 На самом деле кажется, что вы правы, это значение NULL в одной строке и строковое значение NULL в другой. Чем отличаются значения, я не уверен, это база данных SAP, которая обновлялась только через клиент SAP.   -  person nickc    schedule 04.11.2016


Ответы (2)


Есть 2 возможности.

  1. Отцовская карта может иметь строковое значение «NULL», а не быть NULL на самом деле.
  2. У вас могут быть посторонние пробелы в конце C0817, т.е. 'C0817 '

Чтобы проверить использование:

SELECT  '[' + CardCode + ']', ISNULL(FatherCard, 'Yes is NULL')
FROM    OINV
WHERE   RTRIM(CardCode) = 'C0817'
person Disillusioned    schedule 04.11.2016
comment
Спасибо, Крейг. Я должен был это проверить, но вы правы, значение на самом деле не NULL где T0.CardCode = C0817, а где T0.CardCode = C0189. Я понятия не имею, что и почему, это база данных SAP B1, которая действительно довольно ванильная. - person nickc; 04.11.2016
comment
@nickc Может быть легко ошибиться в том, как установить значение NULL в полях текстового типа. 1) Случайно заключить в кавычки ключевое слово NULL в операторе обновления. Например. UPDATE ... SET Col = 'NULL' 2) Если для обновления значения используется редактор (сетка / текстовое поле), вы можете ошибиться, набрав строку NULL. Некоторые элементы управления (например, редактировать сетку в SQL Server Management Studio) требуют специальной техники для установки NULL, например Ctrl+0. См. Также stackoverflow.com/q/444657/224704 - person Disillusioned; 04.11.2016
comment
Что касается использования оператора CASE, я бы посоветовал лучше очищать ваши данные, чем писать непонятный SQL каждый раз, когда вам может понадобиться обрабатывать крайние случаи. Обратите внимание, что вы также можете подумать, действительно ли пустая строка является допустимым значением. Я подозреваю, что в этом случае нет, поэтому они также должны быть обновлены до NULL. Это легко сделать с помощью UPDATE OINV SET FatherCard = NULL WHERE FatherCard IN ('NULL', ''). Чтобы избежать ухудшения данных в будущем, вы должны убедиться, что все источники ввода могут правильно установить NULL (и, возможно, даже создать ограничения CHECK, чтобы предотвратить определенные известные недопустимые значения). - person Disillusioned; 04.11.2016

Пожалуйста, используйте

where columnname is null
person Eralper    schedule 04.11.2016
comment
Я мог бы использовать оператор if, чтобы проверить, является ли первый столбец is null, а если он есть, тогда использовать второй столбец, но я думал, что это то, что должен делать isnull()? - person nickc; 04.11.2016