是否有允許“= NULL”語法的 DBMS?
受 StackOverflow 問題的啟發(為什麼 SQL 不支持“= null”而不是“is null”?)。
是否有真正支持該
= NULL
語法的 DBMS?
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
您可以將 Postgres 配置
NULL=NULL
為真實。有關更多詳細資訊,請參閱有關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 也支持不同的謂詞。不幸的是,看起來Microsoft 與 SQL Server和 Oracle 與 MySQL 都不支持它。對於 MySQL,它們是一個類似的特性,寫成
<=>
.SQL 1999 定義了一個不同的謂詞(ISO/IEC 9075-2:1999 (E),第 8.13 節)如下(此處未顯示數組類型的情況,由於此平台的限制格式支持而稍微重新格式化):
i) ‘‘X IS DISTINCT FROM Y’’ 為假,如果:
X 和 Y 是空值,或
X = Y,根據子條款 8.2,‘‘比較謂詞’’。
ii) 否則,‘‘X IS DISTINCT FROM Y’’ 為真。
所以對於否定的情況
is not distinct from
:
- 比較產生
TRUE
或FALSE
- 如果兩個值都是
NULL
它產生TRUE
- 如果一個值是
NULL
它產生FALSE
- 否則,它會產生第一個值
=
第二個值的結果。