Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server 使用WHERE选择所有行_Sql Server_Tsql - Fatal编程技术网

Sql server 使用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='',则查询不会抛出任何内容

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

例如:

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
谢谢你,效果很好。