2014-03-25 40 views
0

當特定值不存在時,我很難找到一種按默認值選擇列的好方法。當特定值不存在於where子句中時選擇默認值

SELECT TOP 1 colD, colE FROM table where (colA = @colA OR colA = 'default') 
     AND (colB = @colB OR colB = 'default') 
     AND (colC = @colC OR colC = 'default') 

當然是有上述查詢的問題在於,它可能與「默認」值,當特定值在表中確實存在返回的行。有沒有經過批准(希望乾淨)的方式來做這樣的事情?我想我需要在那裏有ORDER BY,但我不確定如何最好地處理這個多列。

我想不必爲參數傳遞一個空值。我想傳遞一個特定的值,並檢查列中是否存在特定的值,如果沒有返回'默認'值。

+0

用你自己的話說,你是什麼意思的「默認值」? – DMason

+0

你的意思是隻返回你正在搜索的列嗎? –

+0

我想添加查詢將會經歷的默認行,如果它沒有找到完全匹配。 – flerngobot

回答

2

如果我正確理解你,我認爲這是你需要的。包含一些問題並在tsql註釋中解釋了我的假設。

--Can NULL be passed in for any of the parameters? 
--Adjust this logic (or remove it) to suit your needs. 
IF @colA IS NULL OR @colB IS NULL OR @colC IS NULL 
BEGIN 
    RAISERROR('<Your stored proc name>: all input params must be non-NULL.', 16, 1); 
    RETURN; 
END 

--Search for the row with the input search params. 
--(You're searching for an "exact match", right?) 
SELECT TOP (1) ColD, ColE 
FROM table 
WHERE colA = @colA 
AND colB = @colB 
AND colC = @colC 

--If not found, search for the row with the default ColA/B/C values. 
IF @@ROWCOUNT = 0 
    SELECT TOP (1) ColD, ColE 
    FROM table 
    WHERE colA = 'Default ColA value' 
    AND colB = 'Default ColB value' 
    AND colC = 'Default ColC value' 

--If still not found, raise an error. 
IF @@ROWCOUNT = 0 
    RAISERROR('<Your stored proc name>: no matching row found and no default row found.', 16, 1); 
0

感謝大家的反饋,我結束了使用這種類型的查詢,但對於多列,它看起來像它的完成工作。感謝用戶Hogan here

SELECT name FROM names 
WHERE (colA = @colA) OR (colA = 'ALL' AND NOT EXISTS(
               SELECT name FROM names 
               WHERE colA = @colA))