Richard Asked: 2011-08-20 14:14:35 +0800 CST2011-08-20 14:14:35 +0800 CST 2011-08-20 14:14:35 +0800 CST 是否有允许“= NULL”语法的 DBMS? 772 受 StackOverflow 问题的启发(为什么 SQL 不支持“= null”而不是“is null”?)。 是否有实际支持该= NULL语法的 DBMS? database-recommendation 4 个回答 Voted Best Answer Mark Storey-Smith 2011-08-20T14:56:07+08:002011-08-20T14:56:07+08:00 SQL 的某些实现确实将 x = NULL 识别为相等,而另一方面,ISO/ANSI 标准则不然。例如,在 SQL Server 中,SET ANSI_NULLS OFF 导致 (NULL = NULL) = true。 SET ANSI_NULLS OFF SELECT CASE WHEN NULL = NULL THEN 1 ELSE 0 END SET ANSI_NULLS ON SELECT CASE WHEN NULL = NULL THEN 1 ELSE 0 END Augustus Kling 2011-08-21T12:22:14+08:002011-08-21T12:22:14+08:00 您可以将 Postgres 配置为 see NULL=NULLas true。有关详细信息,请参阅有关transform_null_equals的文档。答案的 Postgres 特定部分结束。 我不建议使用此设置来使NULL另一个设置相等,NULL因为NULL它具有未知的含义。由于您不知道两个未知事物是否引用同一个对象(值),NULL因此与某物进行比较应该始终导致NULL(比较结果未知)。以不同的方式调用会更好NULL——例如UNKNOWN——但 SQL 选择不这样做。 如果您想查看是否有未知内容,请使用thing is NULL. 如果您想查看两个事物是否相等或两者都NULL使用thing1 is not distinct from thing2. 有关此语法的更多信息,请参阅Postgre 比较函数的页尾。Firebird 关于此事的文档还包括一个显示样本比较及其结果的表格。维基百科也有表格。根据他们的文档,IBM 的 DB2 也支持 distinct predicate 。 不幸的是,看起来Microsoft 的 SQL Server和 Oracle 的 MySQL 都不支持它。对于 MySQL,它们是类似的功能,写为<=>. SQL 1999 定义了一个不同的谓词(ISO/IEC 9075-2:1999 (E),第 8.13 节)如下(此处未显示数组类型的情况,由于该平台的格式支持受限而略微重新格式化): i) ''X IS DISTINCT FROM Y'' 为假,如果: 1) X 和 Y 是空值,或 2) 根据第 8.2 节,''比较谓词'' X = Y。 ii) 否则,“X 与 Y 不同”为真。 所以对于否定的情况is not distinct from: TRUE比较结果要么FALSE 如果两个值都是NULL它产生TRUE 如果一个值是NULL它产生FALSE 否则它会产生第一个值=第二个值的结果。 mrdenny 2011-08-20T14:58:54+08:002011-08-20T14:58:54+08:00 您必须记住 NULL 不是常量,而是一个未知数。你不能等于一个未知数,因为你不知道 NULL 的值。 Jonathan Leffler 2011-08-21T10:51:56+08:002011-08-21T10:51:56+08:00 可能的答案是“所有 SQL DBMS 都支持= NULL”,但在 UPDATE 语句的 SET 子句中是正确的,而不是在需要条件的上下文中。该上下文当然不会接受 IS NULL (您不能编写SET SomeCol IS NULL)。
SQL 的某些实现确实将 x = NULL 识别为相等,而另一方面,ISO/ANSI 标准则不然。例如,在 SQL Server 中,SET ANSI_NULLS OFF 导致 (NULL = NULL) = true。
您可以将 Postgres 配置为 see
NULL=NULL
as true。有关详细信息,请参阅有关transform_null_equals的文档。答案的 Postgres 特定部分结束。我不建议使用此设置来使
NULL
另一个设置相等,NULL
因为NULL
它具有未知的含义。由于您不知道两个未知事物是否引用同一个对象(值),NULL
因此与某物进行比较应该始终导致NULL
(比较结果未知)。以不同的方式调用会更好NULL
——例如UNKNOWN
——但 SQL 选择不这样做。如果您想查看是否有未知内容,请使用
thing is NULL
.如果您想查看两个事物是否相等或两者都
NULL
使用thing1 is not distinct from thing2
. 有关此语法的更多信息,请参阅Postgre 比较函数的页尾。Firebird 关于此事的文档还包括一个显示样本比较及其结果的表格。维基百科也有表格。根据他们的文档,IBM 的 DB2 也支持 distinct predicate 。不幸的是,看起来Microsoft 的 SQL Server和 Oracle 的 MySQL 都不支持它。对于 MySQL,它们是类似的功能,写为
<=>
.SQL 1999 定义了一个不同的谓词(ISO/IEC 9075-2:1999 (E),第 8.13 节)如下(此处未显示数组类型的情况,由于该平台的格式支持受限而略微重新格式化):
所以对于否定的情况
is not distinct from
:TRUE
比较结果要么FALSE
NULL
它产生TRUE
NULL
它产生FALSE
=
第二个值的结果。您必须记住 NULL 不是常量,而是一个未知数。你不能等于一个未知数,因为你不知道 NULL 的值。
可能的答案是“所有 SQL DBMS 都支持
= NULL
”,但在 UPDATE 语句的 SET 子句中是正确的,而不是在需要条件的上下文中。该上下文当然不会接受 IS NULL (您不能编写SET SomeCol IS NULL)。