当特定值不存在时,我很难找到通过默认值选择列的好方法。
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 :(得分: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))