Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当where子句中不存在特定值时选择默认值_Sql_Sql Server 2008_Stored Procedures - Fatal编程技术网

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))