2010-05-11 64 views
1

我有一個關於where語句中的case語句和null的問題。SQL Where Where

我要做到以下幾點:

Declare @someVar int = null 

select column1 as a from 
TestTable t 
where column1 = case when @someVar is not null then @someVar else column1 end 

這裏的問題是:

比方說@someVar爲空。我們還要說TestTable中的column1具有NULL列值。然後,在case語句中我的條件t = t將始終評估爲false。

我基本上只是希望能夠根據@someVar的值(如果提供的話)有條件地過濾列。任何幫助?

回答

2
  • 如果@someVar IS NULL總是返回該行。
  • 如果@someVar IS NOT NULLcolumn1 = @someVar返回該行。
  • 否則不要返回該行。

那麼試試這個:

SELECT column1 
FROM TestTable t 
WHERE @someVar IS NULL OR column1 = @someVar 

要測試這個表達式的作品嚐試插入一些測試值到一個表,然後獲取所有行,其中b爲空或a等於b

CREATE TABLE Table1 (a VARCHAR(20) NULL, b VARCHAR(20) NULL); 
INSERT Table1 (a, b) VALUES 
(NULL, NULL), 
('Foo', NULL), 
(NULL, 'Foo'), 
('Foo', 'Foo'), 
('Bar', 'Foo'); 

SELECT * 
FROM Table1 
WHERE b IS NULL OR a = b 

結果:

a  b 
NULL NULL 
Foo NULL 
Foo Foo 
+0

我這樣做是因爲上面的生成語法錯誤(我在SQL Server) 「其中@someVar爲NULL或列1 = @someVar」 這一工程!你在做同樣的事情嗎? – needshelp 2010-05-11 00:32:58

+0

不應該是OR column1 = COALESCE(@someVar,0) – 2010-05-11 00:39:06

+0

@needshelp:你說得對。我已經更新了我的答案。 – 2010-05-11 06:17:50

2

雖然條件篩選是主流模式,但我敦促您重新考慮您的意圖。將多個查詢壓縮爲單個形狀的次數越多,就越會干擾優化程序找出查詢所做的操作的能力,並且生成的查詢執行計劃的可能性越低。

在這種情況下,如果不檢查@somevar,優化程序無法判斷column1是否爲過濾器。那麼應該使用column1上的索引還是不使用?

+0

你還會怎麼做?這是一個艱難的地方在 – 2010-05-11 00:53:20

+1

壓縮多個查詢到一個單一的替代方案,是表示多個查詢 - 單獨到數據庫。如果您將查詢視爲轉換爲(單一)執行計劃的文本,那麼您就明白了。如果你發現你確實需要一個可組合的塊來讓你的查詢出來(實際上,誰也沒有),我推薦一個ORM,比如LinqToSql。 ORM在客戶端組成查詢文本,數據庫只能看到預期的查詢 - 而不是一堆變量。 – 2010-05-11 01:08:08