2014-08-28 83 views
0

我知道在SQL中,當我們比較兩個NULL值時,結果總是爲false。因此,諸如SQL Server 2008中的NULL比較

SELECT case when NULL = NULL then '1' else '0' end 

將總是打印'0'。我的問題是像ISNULL這樣的函數如何確定值是否爲null。因爲,根據我的理解(並在上面的查詢中解釋),兩個空值的比較始終爲FALSE。

+0

你試圖找到一種方法,使您的發言工作(其中現有的答案正在解決),還是你真的在問SQL Server中的'ISNULL'函數本身是如何工作的? – 2014-08-28 09:57:44

+2

否,'NULL = NULL'返回'UNKNOWN',而不是'FALSE'。當NOT(NULL = NULL),然後'1'else'0'end'返回0時,嘗試'SELECT case。並且什麼使得你認爲*內置函數在SQL中實現? – 2014-08-28 10:00:21

+0

@AdrianWragg:其實我在問第二個。 SQL服務器中的ISNULL函數如何工作。如果兩個空值的比較未定義/未知,那麼'isnull'函數如何比較兩個空值以返回適當的結果? – AshutoshPujari 2014-08-28 10:02:21

回答

2

您最初的假設似乎是ISNULL是現有的功能,可以直接在SQL語句中實現一個別名,以同樣的方式,一個SQL函數可以。然後你問這個功能是如何工作的。

這是一個不正確的起點,因此混亂。相反,像INLIKE類似的命令,ISNULL被解析並在數據庫引擎本身內運行;其實際執行情況是最有可能用C寫的

如果你真的要考慮執行的細節,你可以在MySQL的看一看,而不是 - 它是開源的,所以您可以通過搜索看看ISNULL如何在那裏實現的代碼。如果需要,他們甚至提供guided tour的代碼。

+0

這正是我所期待的。非常感謝! – AshutoshPujari 2014-08-28 12:49:19

4

您需要設置set ansi_nulls off,然後檢查結果。空可以被認爲是一個未知的值,當你比較兩個未知的值,那麼你會得到的結果只是假的。比較null = null是未定義的。

set ansi_nulls off 
SELECT case when NULL = NULL then '1' else '0' end 

結果: -

1 

MSDN

當SET ANSI_NULLS爲OFF時,等於(=)並且不等於(<>) 比較運算符不遵循ISO標準。使用WHERE column_name = NULL的SELECT 語句將返回 在column_name中具有空值的行。使用WHERE的SELECT語句 column_name <> NULL返回 列中具有非空值的行。此外,使用WHERE列名稱的SELECT語句<> XYZ_value返回非XYZ_value且不是 NULL的所有行。

正如Damien在註釋中正確指出的那樣,NULL = NULL的行爲是未知或未定義。

+0

是的。我知道使用ansi_nulls。但我的問題更多地圍繞着isnull函數如何處理空值。從上面的解釋,它看起來像在isnull函數裏面,我們使用ansi_nulls off來比較值。如果錯了,糾正我。 – AshutoshPujari 2014-08-28 10:00:32

+0

@AshutoshPujari: - 正如我所說的,認爲它是未知值,所以當你比較兩個未知值時,當set_ansi設置爲ON時它總是假的 – 2014-08-28 10:01:32

+0

不,NULL = NULL計算爲'UNKNOWN',而不是'FALSE' 。如果你否定這個表達,它仍然不是「真實的」。 – 2014-08-28 10:01:35

0
set ansi_nulls off 

SELECT case when NULL = NULL then '1' else '0' end 

result=1 

set ansi_nulls on 
SELECT case when NULL = NULL then '1' else '0' end 

result=0 


so that is the difference 
+2

和我的答案有什麼不同,甚至沒有提供任何解釋? – 2014-08-28 09:55:49

+1

需要說明 – 2014-08-28 11:11:10

-2
SELECT case when 'NULL' = 'NULL' then '1' else '0' end 


SELECT case when isnull(columnname,'NULL')='NULL' then '1' else '0' end 



SET ANSI_NULLS OFF 

SELECT case when NULL = NULL then '1' else '0' end 
+0

'NULL'與NULL不一樣 – 2014-08-28 10:12:18

1

...或{2}你是否真的在詢問SQL 服務器本身的ISNULL功能是如何工作的?

其實我要求第二個{2}。 SQL服務器 中的ISNULL函數的工作原理。如果兩個空值的比較未定義/未知,那麼如何將空值函數與兩個空值進行比較以返回適當的 結果?

空值是在結構化查詢語言(SQL)中使用的特殊標記,以指示一個數據值不存在於數據庫中。 ... NULL (SQL)

ISNULL (check_expression , replacement_value)不關心比較值。第一個參數純粹與the existence of value有關。

它測試check_expression是否有任何價值。如果它有任何值返回值。如果check_expression沒有值,則ISNULL函數返回第二個參數replacement_value

它不會比較這兩個值。它僅在第一個參數中測試the existence of value

0

我希望工程

SELECT CASE WHEN ISNULL(NULL,NULL)= NULL THEN 1 ELSE 0 END