Sql server 使用WHERE选择所有行
在带有where的查询中,我仍然需要能够遍历结果中的所有行 例如:Sql server 使用WHERE选择所有行,sql-server,tsql,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='',则查询不会抛出任何内容
declare @Crit nvarchar(15)
set @Crit = 'Package'; --as an example
IF @Crit = ''
¿¿??
SELECT * FROM Criterios
WHERE CRITERIO = @Crit
在本例中,如果我将@Crit的值设置为“Package”,它的工作方式与普通查询类似,但是如果我没有设置任何值@Crit='',则查询不会抛出任何内容
我试图在if中做的是,计算一个等于所有值的值,有点像是*从选择
有没有办法做到这一点?您正在讨论一个条件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
DECLARE@SQL-NVARCHAR(1000)
SET@SQL='SELECT*FROM Criterios'
如果(@Crit“”)
设置@SQL=@SQL+'其中CRITERIO=@Crit'
执行sp_executesql@SQL,N'@Crit VARCHAR(10)',@Crit
根据不同的情况,每种方法都有其优点和缺点。动态SQL通常可读性较差,编写起来更复杂(需要注意SQL注入),但可以为您提供更好的执行计划,特别是在更复杂的场景中,因为您最终只能得到所需的确切条件。执行此操作的典型方法是不传递参数值
SELECT * FROM Criterios
WHERE CRITERIO = @Crit
OR @Crit IS NULL
但要注意这种模式。您可能会造成一些严重的性能问题。这里有一篇很棒的文章,详细介绍了如何解决这个问题
如果您使用的是空字符串,您可以将上面的内容稍微更改为
SELECT * FROM Criterios
WHERE CRITERIO = @Crit
OR @Crit = ''
考虑使用函数返回第一个非空值,如下所示
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)
您可以使用动态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;
你是在找像这样的
吗?当@Crit=''时CRITERIO=case,然后CRITERIO else@Crit end
谢谢你,效果很好。