Запутанный в запросе SQL, вовлекающем "Нуль", возвращает не выбранную строку - PullRequest
0 голосов
/ 21 октября 2011

Я смущен результатом двух запросов SQL.Укажите содержимое таблицы и два запроса:

Col1 Status
---- ------ 
abcd "null"
abcd PENDING
defg "null"
defg PENDING

a) SELECT Col1, STATUS FROM TABLE_A WHERE KEY IN ('abcd','defg');

b) SELECT Col1, STATUS FROM TABLE_A WHERE KEY IN ('abcd','defg') and NOT (STATUS = 'PENDING')

результат (a) показывает все 4 строки, а результат (b)) ничего не показывает!

Столбец «Статус» может иметь значения, отличные от «В ОЖИДАНИИ», и по причине сообщения я не могу использовать «СОСТОЯНИЕ НЕ НУЛЬ» в качестве фильтра.Я НЕ МОГУ понять, почему запрос (b) ничего не возвращает.Заранее благодарим за любую помощь

Платформа: MSSQL 2008

1 Ответ

2 голосов
/ 21 октября 2011

SQL использует трехзначную логику (True, False, Unknown). Предложение WHERE должно иметь значение True для строки, подлежащей возврату.

STATUS = 'PENDING' возвращает UNKNOWN при Status IS NULL.

Если вы отрицаете Unknown, вы все равно получаете Unknown.

См. SQL и западня трехзначной логики

Вам нужно переписать запрос как

SELECT Col1, STATUS 
FROM TABLE_A 
WHERE KEY IN ('abcd','defg') and (STATUS IS NULL OR  STATUS  <> 'PENDING')

(хотя можно использовать устаревшую опцию ANSI_NULLS session, чтобы получить желаемое поведение)

...