我遇到一篇描述SQL代碼可能不正確的不同情況的文章。然而,有一個point這是令我驚訝的。他們聲稱沒有ISNULL臭的條件嗎?
明智的做法是明確的處理在空列空值,通過使用COALESCE提供一個默認值
ISNULL
被提及爲好。他們還引用這個MSDN web page舉例ISNULL
。這裏的基本想法是,它是更好地使用
SELECT COUNT(*) FROM [dbo].[Table1] WHERE ISNULL([c2],0) > 2;
然後
SELECT COUNT(*) FROM [dbo].[Table1] WHERE [c2] > 2;
然而,第一變異不會是特區政府,而,結果不被ISNULL
任何影響。我知道需要在輸出中使用ISNULL
或COALESCE
來處理NULL
,但是,我始終嘗試使用IS NULL
或IS NOT NULL
來處理謂詞中的NULL
。我想念什麼? MSDN問題的重點是什麼?
編輯:以上討論反應並主要是對本post我已經準備了一個簡單的測試
IF OBJECT_ID('dbo.LogTable', 'U') IS NOT NULL DROP TABLE dbo.LogTable
SELECT TOP 100000 DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0) datesent ,
CASE WHEN (ABS(CHECKSUM(NEWID())) % 100) = 1 THEN NULL ELSE (ABS(CHECKSUM(NEWID())) % 1000) END ivalue
INTO [LogTable]
FROM sys.sysobjects
CROSS JOIN sys.all_columns
CREATE INDEX ix_logtable_ivalue ON LogTable(ivalue asc) INCLUDE(datesent);
-- Q1
select * from logtable where isnull(ivalue, 0) > 998
-- Q2
select * from logtable where ivalue > 998
然而,在Q1的ivalue
不SARG。有沒有發現?我應該如何爲這個特定的數據和查詢創建屬性SARG?
你是對的。不要放入不必要的NULL檢查,因爲這會妨礙索引的使用。我強烈推薦'IS NULL' /'IS NOT NULL'。這些是ANSI標準結構。 –
這個例子來自於旨在檢測不良數據庫代碼以進行改進的事實,這一事實非常令人擔憂。你*需要考慮當比較可能爲'NULL'的值時會發生什麼情況,但反思性地將'ISNULL'放在每個地方都是完全錯誤的。 –
'MSDN問題'的一點是什麼?不知道:-)來自[原始來源]的評論(https://www.red-gate.com/simple-talk/sql/t-sql-programming/sql-code-smells/#not-handling-null- values-in-nullable-columns)在計算事物時很有意義,但是[MSDN](https://msdn.microsoft.com/en-us/library/dd172133(v = vs.100).aspx)是完全錯誤的。 –