2016-09-06 45 views
-1

在带有where的查询中,我需要仍然可以将所有行作为结果。选择使用WHERE的所有行

例如:

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

IF @Crit = '' 
    ¿¿?? 

SELECT * FROM Criterios 
WHERE CRITERIO = @Crit 

在这种情况下,如果我设置@Crit以“包”,它像一个正常的查询,但该值如果我不设置任何值@Crit =' ',并且查询不会引发任何事情。

我想在if里面做什么,是预先指定一个等于所有东西的值,从*中选择*。

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

+0

你在找'LIKE'吗? – techspider

+0

'其中CRITERIO = case时@Crit =''那么CRITERIO else @Crit结束' – shawnt00

回答

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注入),但是可以为您提供更好的执行计划,尤其是在更复杂的情况下,因为您只能得到所需的确切条件。

+0

谢谢,作品完美。 – Piston

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 = '' 
+0

谢谢,工作正常;) – Piston

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

您可以使用动态SQL来做到这一点。如果@crit为null,则排除where子句,如果它不为null,它将位于where子句中。

DECLARE @crit nvarchar(15) = 'Package' 
    ,@sqlStatement nvarchar(max) = 
    'SELECT * FROM Criterios' 
; 

SET @sqlStatement = CONCAT(@sqlStatement,'WHERE CRITERIO = ' [email protected]) 

EXEC sp_executesql @sqlStatement;