SQL - объяснение! = 'NULL' - PullRequest
       5

SQL - объяснение! = 'NULL'

0 голосов
/ 30 апреля 2018

Мой код SSMS выглядит следующим образом:

Select top(50)
From FilteredContact
Where statuscode = 1 
and emailaddress1 != 'NULL' 
and telephone1 != 'NULL' 
and address1_line1 != 'NULL' 

Я понимаю, что в идеале последние три строки должны быть отформатированы следующим образом:

and emailaddress1 IS NOT NULL
and telephone1 IS NOT NULL
and address1_line1 IS NOT NULL

Тем не менее, мой оригинальный код на самом деле работал совершенно нормально. Это почему? Я думал, что NULL было неизвестным значением, а не строковым значением, равным 'NULL'

Если кто-нибудь знает, объяснение будет с благодарностью! Спасибо.

Ответы [ 4 ]

0 голосов
/ 30 апреля 2018

Тем не менее, мой оригинальный код на самом деле работал совершенно нормально.

Работал случайно. Если, например, emailaddress1 ='NULL' (строковое значение, состоящее из четырех символов: N U L L), тогда условие оценивается как FALSE и является неправильным. Так как адрес электронной почты вряд ли будет NULL, то да - он работал отлично:)


См. Этот ответ для более подробного объяснения: НЕ В выборе со значениями NULL

Короче говоря:

Сравнения с NULL и трехзначной логикой (3VL)

Поскольку Null не является членом какой-либо области данных, он не считается «значение», а скорее маркер (или заполнитель), указывающий на отсутствие стоимости. Из-за этого сравнение с нулем никогда не может привести к либо True, либо False, но всегда в третьем логическом результате, Неизвестно. [8] Логический результат выражения ниже, который сравнивает значение от 10 до Null, неизвестно:

SELECT 10 = NULL - результаты неизвестны

так что оба сравнения: x = NULL и x <> NULL оценивается как NULL (неизвестно).

В вашем состоянии, скажем, and telephone1 != 'NULL', если telephone равно NULL, тогда все условия оцениваются как NULL, что рассматривается как условие false в предложении WHERE.

0 голосов
/ 30 апреля 2018

emailaddress1 != 'NULL' сравнивает emailaddress1 и строку 'NULL'. Поскольку поле почти наверняка является строкой, тип соответствует достаточно хорошо. И поскольку никто не будет иметь адрес электронной почты 'NULL', сравнение не исключит допустимые строки (которые имеют ненулевые, но также и не 'NULL' значения).

Когда все становится немного менее интуитивно понятным, это когда значение поля на самом деле NULL. В стандартном SQL результат почти любого сравнения со значением NULL равен UNKNOWN (что обычно обрабатывается так же, как NULL). Поскольку СУБД возвращает только те строки, в которых выполняется условие, она не будет возвращать эту строку.

Таким образом, сравнение работает, если только строка 'NULL' не будет действительной в этом поле.

0 голосов
/ 30 апреля 2018

Это не включает ANSI_NULL (я не думаю). Вы пытаетесь сопоставить строку в предложении where. Когда вы ищете !='NULL', вы просите SSMS вернуть все, что не является строкой «NULL». Поскольку NULL является неизвестным и все сравнения с ним будут NULL, он будет возвращать только другие допустимые строки.

DECLARE @testing TABLE (ID INT, items VARCHAR(100))
INSERT INTO @testing (ID, items)
VALUES 
(1,'blah'),
(2,'blahhhhhh'),
(3,'NULL'),
(4,NULL)


SELECT * 
FROM @testing 

--will return values that are NOT the string 'NULL' and values that are not NULL
--because NULL compared to anything is NULL
SELECT * 
FROM @testing 
WHERE items != 'NULL'

SELECT * 
FROM @testing 
WHERE items <> 'NULL'

--will return all string values that have a non-NULL value
SELECT * 
FROM @testing 
WHERE items IS NOT NULL 
0 голосов
/ 30 апреля 2018

Я думаю,

SET ANSI_NULLS OFF

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql?view=sql-server-2017

Или, как другие предположили, NULL хранится в виде строки.

...