使用WHERE选择所有行

时间:2016-09-06 16:03:20

标签: sql-server tsql

在带有where的查询中,我需要能够仍然遍历所有行。

例如:

declare @Crit nvarchar(15)
set @Crit = 'Package'; --as an example

IF @Crit = ''
    ¿¿??

SELECT *  FROM Criterios
WHERE CRITERIO = @Crit

在这种情况下,如果我将@Crit的值设置为' Package',它就像普通查询一样工作,但如果我没有设置任何值@Crit ='&#39 ;,并且查询不会抛出任何内容。

我在if中尝试做的是指定一个等于一切的值,从选择中排序*。

无论如何要实现这个目标吗?

4 个答案:

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