【发布时间】:2014-09-03 10:13:29
【问题描述】:
我在理解 SQL Server 中的 = 和 is 运算符时遇到问题。
考虑以下示例查询,它们在各自的输出中具有不同的行为:
SELECT * FROM tableName WHERE colName IS NULL;
SELECT * FROM tableName WHERE colName = NULL;
第一个查询将提供所需的输出,即选择colName 具有null 值的那些记录。但第二次查询将导致零匹配记录。
请说明这些运算符的不同用途及其优缺点。
编辑
在这里,大多数答案都声称= 不适用于null,但以下语句将适用于null 和=。
SET ANSI_NULLS OFF
SELECT * FROM tableName WHERE colName = NULL;
这将提供与具有is 运算符的语句相同的结果。
【问题讨论】:
-
阅读文档通常会有所帮助。 = (Equals) (Transact-SQL)
-
请注意,尽管在 SQL Server 的未来版本中,
ANSI_NULLS将始终为ON,而SET ANSI_NULLS_OFF将返回错误:msdn.microsoft.com/en-us/library/ms188048.aspx -
使用 ANSI_NULLS OFF 是一种 hack。非标准。微软明确告诉我们不要在这里使用它:msdn.microsoft.com/en-us/library/ms188048.aspx。所以是的,如果 ANSI_NULLS OFF,等号会给你不同的结果,这是可怕的,应该避免。
-
MySql,顺便说一句,在这里对 SQL 标准进行了很好的扩展:null-safe 相等运算符 让您明确要求将 null 视为等于另一个 null。 (除了 T-SQL 中的 ANSI_NULLS OFF 之外,当 col1 和 col2 都包含 null 时,它也将 col1 和 col2 视为相等。)
标签: sql sql-server