SQL-解释!='空'

SQL-解释!='空',sql,sql-server,null,Sql,Sql Server,Null,我的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 我意识到,

我的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
我意识到,理想情况下,最后三行的格式如下:

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'的字符串值

如果有人知道,将不胜感激!谢谢。

我猜

SET ANSI_NULLS OFF
或者正如其他人所建议的,NULL被存储为字符串。

emailaddress1!='NULL'比较emailaddress1和字符串'NULL'。由于字段几乎肯定是字符串,因此类型匹配得足够好。而且,由于没有人的电子邮件地址是“NULL”,因此比较不会消除具有非NULL值,但也具有非-NULL值的有效行

当字段的值实际上为空时,事情就变得不那么直观了。在标准SQL中,与空值进行任何比较的结果都是未知的,通常将其视为空值。因为DBMS只返回条件为true的行,所以它不会返回该行

因此,除非字符串“NULL”在该字段中是有效的,否则比较是有效的。

我认为这不涉及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 
然而,我的原始代码实际上运行得非常好

工作是偶然的。例如,如果emailaddress1='NULL'是一个由四个字符组成的字符串值:N U L L,则该条件的计算结果为FALSE,不正确。由于电子邮件地址不太可能为空,那么是的-它工作得很好:

有关详细解释,请参见此答案: 简言之:

与NULL和三值逻辑3VL的比较

由于Null不是任何数据域的成员,因此它不被视为 值,而是指示缺少的标记或占位符 有价值的。因此,与Null的比较永远不会导致 不管是真是假,但总是在第三个逻辑结果中, 未知。[8]下面表达式的逻辑结果,比较 值10到Null未知:

选择10=NULL-结果未知

因此,两种比较: x=NULL,x NULL的计算结果为NULLunknown


在你的情况下,说和打电话1!='NULL',如果telephone为NULL,则整个条件的计算结果为NULL,在WHERE子句中将其视为false条件。

“NULL”是字符串,它不是NULL。有时人们在数据库中存储错误数据。看起来字符串“NULL”存储在表中,而不是值中NULL@LONG谢谢你的快速回复!我在打开和关闭ansi_nulls的情况下测试了代码,没有任何更改。我认为这与ansi_nulls的设置无关。这将使ColumnNull和ColumnNotNull的功能有所不同。但这不是你的问题。我相信@user2864740是正确的,您的数据中有'NULL'字符串文字,或者确实有。是的,正如人们在这里提到的,这不是NULL,而是字符串文字'NULL'。文字/文本“NULL”而不是由NULL表示的缺少数据。这很有意义,非常感谢!这确实是巧合,用任何字符串值替换“NULL”都会产生相同的结果。空值不能与字符串值进行比较。