在带有where的查询中,我需要能够仍然遍历所有行。
例如:
declare @Crit nvarchar(15)
set @Crit = 'Package'; --as an example
IF @Crit = ''
¿¿??
SELECT * FROM Criterios
WHERE CRITERIO = @Crit
在这种情况下,如果我将@Crit的值设置为' Package',它就像普通查询一样工作,但如果我没有设置任何值@Crit ='&#39 ;,并且查询不会抛出任何内容。
我在if中尝试做的是指定一个等于一切的值,从选择中排序*。
无论如何要实现这个目标吗?
答案 0 :(得分:2)
您正在谈论条件WHERE子句,可以通过多种方式实现。
一种方法是:
SELECT *
FROM Criterios
WHERE (CRITERIO = @Crit OR @Crit = '')
另一种方法是使用动态SQL:
DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM Criterios'
IF (@Crit <> '')
SET @SQL = @SQL + ' WHERE CRITERIO = @Crit'
EXECUTE sp_executesql @SQL, N'@Crit VARCHAR(10)', @Crit
根据情况,各有利弊。动态SQL通常不太可读,编写起来更复杂(需要注意SQL注入),但可以为您提供更好的执行计划,尤其是在更复杂的场景中,因为您最终只能得到所需的确切条件。
答案 1 :(得分:2)
这样做的典型方法是不传递参数值。
SELECT * FROM Criterios
WHERE CRITERIO = @Crit
OR @Crit IS NULL
虽然要小心这个模式。您可以创建一些严重的性能问题。这篇文章详细介绍了如何解决这个问题。
http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/
如果您使用空字符串卡住,可以稍微更改上面的内容。
SELECT * FROM Criterios
WHERE CRITERIO = @Crit
OR @Crit = ''
答案 2 :(得分:1)
您可以使用动态SQL来执行此操作。如果@crit为null,则排除where子句,如果它不为null,则它将在where子句中。
DECLARE @crit nvarchar(15) = 'Package'
,@sqlStatement nvarchar(max) =
'SELECT * FROM Criterios'
;
SET @sqlStatement = CONCAT(@sqlStatement,'WHERE CRITERIO = ' +@crit)
EXEC sp_executesql @sqlStatement;
答案 3 :(得分:0)
考虑使用COALESCE函数返回第一个非空值,如下所示
declare @Crit nvarchar(15)
set @Crit = 'Package'; --as an example
IF @Crit = ''
BEGIN
SET @Crit = NULL
END
SELECT * FROM Criterios
WHERE CRITERIO = COALESCE(@Crit, CRITERIO)