Database-Recommendation

是否有允許“= NULL”語法的 DBMS?

  • August 21, 2011

受 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’’ 為假,如果:

  1. X 和 Y 是空值,或

  2. X = Y,根據子條款 8.2,‘‘比較謂詞’’。

ii) 否則,‘‘X IS DISTINCT FROM Y’’ 為真。

所以對於否定的情況is not distinct from

  • 比較產生TRUEFALSE
  • 如果兩個值都是NULL它產生TRUE
  • 如果一個值是NULL它產生FALSE
  • 否則,它會產生第一個值=第二個值的結果。

引用自:https://dba.stackexchange.com/questions/4848