为什么 column = NULL 没有返回行?

9

可能是重复问题:
为什么在SQL服务器中,NULL = NULL的结果为false

如果你生成一个查询语句,将数据插入到"MyTab"表的列---年龄、性别、出生日期和ID

INSERT INTO MyTab 
VALUES (22, '', '', 4)

列“性别”和“出生日期”的值是什么?

如果值为NULL,则 ---

 SELECT * FROM MyTab
 WHERE Sex=NULL

为什么上面的查询输出是——没有选择行——?

如果值不为空,则——

 SELECT * FROM Mytab
 WHERE Sex IS NULL

上述查询输出结果是如何产生的?

1
NULL并不等同于任何东西。因此,=NULL始终返回false。这就是为什么有一个专门的语法来测试nullness。这对所有ANSI SQL数据库都适用。 - APC
“列Sex和DOB的值会是什么?它是NULL吗?” 这取决于关系型数据库管理系统。在Oracle中,是的,它将为null。在SQL Server中,不是,该值将为空字符串 '' - Shannon Severance
5个回答

12

NULL在SQL中是一个特殊的值,表示缺少数据。因此,您不能进行以下查询:

SELECT fields FROM table WHERE column = NULL

NULL 无法与任何东西进行比较,包括它自己。相反,您需要使用:

SELECT fields FROM table WHERE column IS NULL
然而在您的情况下,您实际上是在SexDOB中插入一个空值。
一个空值不是NULL。您需要查询以下内容:
SELECT fields FROM table WHERE column = ''

2

'' - 这表示空字符串。如果您想插入NULL,需要使用

 INSERT INTO MyTab 
          VALUES (22, '', NULL, 4)

2

来自Null(SQL)

对Null的工作原理的误解是SQL代码中许多错误的原因,无论是在ISO标准SQL语句中还是在实际数据库管理系统支持的特定SQL方言中。 这些错误通常是由于Null和0(零)或空字符串(长度为零的字符串值,在SQL中表示为'')之间的混淆而导致的。然而,Null被ISO SQL标准定义为与空字符串和数值0都不同。虽然Null表示没有任何值,但空字符串和数值0都代表实际值。

还来自SET ANSI_NULLS

当SET ANSI_NULLS关闭时,等于(=)和不等于(<>)比较运算符不遵循SQL-92标准。使用WHERE column_name = NULL的SELECT语句返回column_name中具有null值的行。使用WHERE column_name <> NULL的SELECT语句返回列中具有非null值的行。此外,使用WHERE column_name <> XYZ_value的SELECT语句返回所有不是XYZ值且不是NULL的行。


0

NULL代表没有数据(甚至不是空白或空的东西),所以Column = NULL不会起作用,尽管Column IS NULL应该返回该列为NULL的行。但是你插入''值,因此与NULL进行比较不会返回任何行。


0

正如其他人所说,第一个查询没有返回任何输出,因为您不能使用等于运算符检查 NULL。第二个查询更令人困惑-我唯一的猜测是您正在使用 Oracle,它将空字符串视为 NULL。

关于 Sex 和 DOB 字段中的值的问题的答案取决于这些字段的类型和您正在使用的数据库引擎。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接