我知道在SQL中,當我們比較兩個NULL值時,結果總是爲false。因此,諸如SQL Server 2008中的NULL比較
SELECT case when NULL = NULL then '1' else '0' end
將總是打印'0'。我的問題是像ISNULL
這樣的函數如何確定值是否爲null。因爲,根據我的理解(並在上面的查詢中解釋),兩個空值的比較始終爲FALSE。
我知道在SQL中,當我們比較兩個NULL值時,結果總是爲false。因此,諸如SQL Server 2008中的NULL比較
SELECT case when NULL = NULL then '1' else '0' end
將總是打印'0'。我的問題是像ISNULL
這樣的函數如何確定值是否爲null。因爲,根據我的理解(並在上面的查詢中解釋),兩個空值的比較始終爲FALSE。
您最初的假設似乎是ISNULL
是現有的功能,可以直接在SQL語句中實現一個別名,以同樣的方式,一個SQL函數可以。然後你問這個功能是如何工作的。
這是一個不正確的起點,因此混亂。相反,像IN
和LIKE
類似的命令,ISNULL
被解析並在數據庫引擎本身內運行;其實際執行情況是最有可能用C寫的
如果你真的要考慮執行的細節,你可以在MySQL的看一看,而不是 - 它是開源的,所以您可以通過搜索看看ISNULL如何在那裏實現的代碼。如果需要,他們甚至提供guided tour的代碼。
這正是我所期待的。非常感謝! – AshutoshPujari 2014-08-28 12:49:19
您需要設置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的行爲是未知或未定義。
是的。我知道使用ansi_nulls。但我的問題更多地圍繞着isnull函數如何處理空值。從上面的解釋,它看起來像在isnull函數裏面,我們使用ansi_nulls off來比較值。如果錯了,糾正我。 – AshutoshPujari 2014-08-28 10:00:32
@AshutoshPujari: - 正如我所說的,認爲它是未知值,所以當你比較兩個未知值時,當set_ansi設置爲ON時它總是假的 – 2014-08-28 10:01:32
不,NULL = NULL計算爲'UNKNOWN',而不是'FALSE' 。如果你否定這個表達,它仍然不是「真實的」。 – 2014-08-28 10:01:35
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
和我的答案有什麼不同,甚至沒有提供任何解釋? – 2014-08-28 09:55:49
需要說明 – 2014-08-28 11:11:10
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
'NULL'與NULL不一樣 – 2014-08-28 10:12:18
...或{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
。
我希望工程
SELECT CASE WHEN ISNULL(NULL,NULL)= NULL THEN 1 ELSE 0 END
你試圖找到一種方法,使您的發言工作(其中現有的答案正在解決),還是你真的在問SQL Server中的'ISNULL'函數本身是如何工作的? – 2014-08-28 09:57:44
否,'NULL = NULL'返回'UNKNOWN',而不是'FALSE'。當NOT(NULL = NULL),然後'1'else'0'end'返回0時,嘗試'SELECT case。並且什麼使得你認爲*內置函數在SQL中實現? – 2014-08-28 10:00:21
@AdrianWragg:其實我在問第二個。 SQL服務器中的ISNULL函數如何工作。如果兩個空值的比較未定義/未知,那麼'isnull'函數如何比較兩個空值以返回適當的結果? – AshutoshPujari 2014-08-28 10:02:21