2012-04-25 49 views
1

我有MS SQL 2008中的表,其中有一列名爲Status。它可以具有「A」或「I」或「P」作爲值。我有一個以@Status作爲參數的存儲過程。如果參數是null,我需要檢索狀態爲A或I或P(基本上忽略狀態字段)的所有記錄。如果參數只有A(例如),我只需要獲取具有A作爲狀態的記錄。如何在沒有IF.. ELSE的單個SELECT語句中完成此操作?SQL查詢 - 獲取所有記錄基於標誌

-- This is just a snippet of a larger query. 
-- Can the following be done without IF ELSE? 
    IF @Status = NULL 
     BEGIN 
     SELECT * FROM Person 
     END 
    ELSE SELECT * FROM Person WHERE Status = @Status 

編輯:我的目標不是重複相同的邏輯兩次。 select語句有一堆連接和東西,我不想在else條件中再次重複它。

編輯#2:我的壞 - 我再次檢查表,它確實包含NULL狀態的記錄,我不想要。這裏的表 -

Id  Status 
-------------- 
1  A 
2  I 
3  P 
4  NULL 

如果@Status爲 「-1」(我將默認參數爲-1),我想1, 2, 3記錄。我如何編寫查詢?

+0

是否有任何機會,你以後會改變主意,並支持多種@Status值?例如,向我展示狀態爲A或I但不是P的所有行? – 2012-04-25 19:14:55

+0

@AaronBertrand:沒有。它要麼有價值,要麼沒有。 – tempid 2012-04-25 19:15:46

回答

1

您可以用做OR:

SELECT * FROM Person WHERE Status = @Status OR @Status IS NULL 

或者UNION ALL:

SELECT * FROM Person WHERE Status = @Status 
UNION ALL 
SELECT * FROM Person WHERE @Status IS NULL 
+0

雖然這會脫離主觀,但我並沒有發現'UNION ALL'版本非常有吸引力。如果查詢實質上更復雜,這可能會成爲維護的噩夢。 – 2012-04-25 19:05:40

0
SELECT * FROM Person WHERE @Status IS NULL OR Status = @Status 
1

第三個選項:

SELECT * FROM dbo.Person WHERE Status = COALESCE(@Status, Status); 

或者你可能更喜歡ISNULL:

SELECT * FROM dbo.Person WHERE Status = ISNULL(@Status, Status); 

只是爲了完整性,儘管這裏的選擇性不太合理,但您可能會發現@Status IS NULL和@Status IS NOT NULL的計劃差別很大,以至於緩存一個或另一個計劃可能導致相反情況下的糟糕表現。處理這個問題的一種方法是動態SQL。所以再次強調,在您的情況下,這可能是一個不錯的選擇,它是這些計劃固定COALESCE/ISNULL/OR選項的常用替代方案。

DECLARE @sql NVARCHAR(MAX); 

SELECT @sql = N'SELECT * FROM dbo.Person' + 
    COALESCE(N' WHERE Status = ''' + CONVERT(VARCHAR(12), @Status) + '''', ''); 

PRINT @sql; 
--EXEC sp_executesql @sql; 

當然你知道你shouldn't be using SELECT * in production code,對不對?

+0

'當然你知道你不應該在生產代碼中使用SELECT *,對吧?'我完全理解。這只是一個例子。 – tempid 2012-04-25 19:12:53

+1

我只是想讓其他讀者清楚,我基於您的示例使用了SELECT *,而不是因爲我認爲這是個好主意。 :-) – 2012-04-25 19:13:57

0
declare @status CHAR(1) 
set @status = 'A' 
select * from Person where (@status IS null) or (@status = status) 

當@status = NULL時,此查詢返回所有記錄。

0

這應做到:

select * from Person 
where (@Status is not null and Status = @Status) or 
     (@Status is null and Status in ('A', 'I', 'P'))