Sql 当where子句中不存在特定值时选择默认值
当特定值不存在时,我很难找到一种通过默认值选择列的好方法Sql 当where子句中不存在特定值时选择默认值,sql,sql-server-2008,stored-procedures,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') 当然,上述查询的问题是,当表中实际存在特定值时,它可能返回具有“default”值的行。有没有一个被认可
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')
当然,上述查询的问题是,当表中实际存在特定值时,它可能返回具有“default”值的行。有没有一个被认可的干净的方法来做这样的事情?我想我需要在那里有ORDER BY,但我真的不确定如何最好地处理多个列
我希望不必为参数传入null值。我想传入一个特定值,并检查该列中是否存在该特定值,如果不存在,则返回“默认”值 如果我理解正确,我想这就是你需要的。在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);
感谢大家的反馈,我最终使用了这种查询,但是对于多个列,它看起来已经完成了任务。感谢用户Hogan
用您自己的话来说,默认值是什么意思?您的意思是只返回您正在搜索的列吗?我想添加默认行,如果查询找不到完全匹配的行,查询将进入这些行。表中除了colA、colB、colC之外还有其他列吗?表中除了colA、colB和colC之外还有其他列。此外,搜索中的列不会在select中返回。
SELECT name FROM names
WHERE (colA = @colA) OR (colA = 'ALL' AND NOT EXISTS(
SELECT name FROM names
WHERE colA = @colA))