当where子句中不存在特定值时,选择默认值

时间:2014-03-25 02:13:28

标签: sql sql-server-2008 stored-procedures

当特定值不存在时,我很难找到通过默认值选择列的好方法。

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,但我不确定如何最好地处理多列的这个问题。

我希望不必为参数传递空值。我想传递一个特定的值,并检查列中是否存在该特定值,如果不是,则返回'默认值'值。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

感谢大家的反馈,我最终使用了这种查询,但是对于多个列而言,看起来它已经完成了工作。感谢用户Hogan here

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