2017-04-06 118 views
1

我知道NULL在SQL是一個未知的值,因此NULL不等於NULL,因爲兩者都是未知的,但我期待在這裏的第二IF返回not eq,而是返回eq。爲什麼?我錯過了什麼?他們爲什麼要評估呢?SQL NULL等於不等於NULL

declare @i int = null 
declare @i2 int = null 

if @i = @i2 select 'eq' else select 'not eq' 
if @i <> @i2 select 'not eq' else select 'eq' 
+1

您使用的是哪個數據庫? SQL Server? – GurV

+0

從來沒有測試過這一點,但嘗試'!='而不是'<>'。 – toonice

+0

@GurV MsSQL 2016,儘管我不確定這是否重要。 – curious

回答

0

NULL是SQL(和大多數字符集)中已知的值。

在替換變量後的問題中,您的第二個測試等同於NULL <> NULL。由於某些東西既不大也不小於自己,因此測試返回false,因此SELECT返回eq

注意:如果遇到無法識別或無效的值,某些功能以及某些操作可能會返回NULL。因此,即使該值不等於NULL函數的值也可以這樣做。即,其中value <> NULL,FUNCTION_1(value) = NULL可能仍然是對的。

+0

根據你的回答,OP的第一個查詢應該返回'eq'而不是'not eq',這不會發生。比較操作只能在已知的值上進行,而不能在未知的情況下進行。對於NULL,只能使用IS NULL或IS NOT NULL。 –

+0

提問者僅指第二個測試,而不是第一個測試。我假設第一個測試按預期執行,即它返回'eq'。 – toonice

+0

第一個查詢不會返回'eq',它將返回'not eq'。由於相同的原因,這兩個查詢結果都會轉到其他部分。如果您不同意我的觀點,請運行這兩個查詢。 –

1

在其最簡單的,這可以通過進行說明:

  1. NULL的值是未知的(或值不存在)
  2. 在此基礎上,涉及NULL任何比較的值(例如,等於=,不等式<>,大於/小於'>')都評估爲未知結果(即NULL本身)。因此,@i = @i2@i <> @i2都返回相同的UnknownNULL結果。
  3. 由於NULL或未知不是True,控制始終分支到ELSE塊,從來沒有到THEN塊。
+0

有道理。任何想法我怎麼能確認'@i <@ @ i2'是'NULL'? – curious

+0

@curious - 運行一個'print(@i <> @ i2)'來查看錶達式的計算結果。 – Phylyp