【问题标题】:Select all data including null if the SQL variable is null如果 SQL 变量为 null,则选择包括 null 在内的所有数据
【发布时间】:2017-01-06 13:05:26
【问题描述】:

我必须在 SQL Server 2012 中运行查询才能从表中选择数据。有一个变量@status。如果此变量为空,则必须返回所有数据,否则如果值为

我对此有一个示例查询

SELECT * 
FROM StatusTable 
WHERE (Status = IIF(@status IS NULL, status, @status))

@status 不为空时,此查询可以正常工作,但当它为空时,它只返回状态列不为空的行。

示例表:

| id | status | Data |
|----|--------|------|
| 1  | null   | a    |
| 2  | ok     | b    |
| 3  | fail   | c    |
| 4  | fail   | d    |
| 5  | null   | e    |

@status 为“失败”时:

| id | status | Data |
|----|--------|------|
| 3  | fail   | c    |
| 4  | fail   | d    |

但是当@status 为空时,它返回:

| id | status | Data |
|----|--------|------|
| 2  | ok     | b    |
| 3  | fail   | c    |
| 4  | fail   | d    |

请帮忙,谢谢

PS:在 null 状态的情况下,我希望返回整个(样本)表

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    使用or:

    SELECT *
    FROM StatusTable
    WHERE (Status = @Status or @Status IS NULL);
    

    【讨论】:

    • 我知道这种查询方式会导致执行计划不理想。
    • @Dai,如果你加上OPTION (RECOMPILE) (and you should add this option to this kind of query),那么执行计划永远是最优的。
    • @RaduGheorghiu,与OPTION(RECOMPILE),如果@Status 变量的值为NULL,优化器将从查询中删除整个WHERE 条件。好像根本没有WHERE。如果 @Status 不为 NULL,优化器将查看参数的特定给定非 NULL 值的可用统计信息并做出更好的决定 - 扫描或查找。
    • @VladimirBaranov 请原谅我的咆哮,不知何故我没有看到@Status IS NULL 前面的@ 符号并将其与Status IS NULL 混淆。
    • 您好,这个查询完美运行,但是我正在寻找一个更快一点的查询,有点像CASE ..WHEN..THERE..END
    猜你喜欢
    • 2015-06-08
    • 2017-05-11
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多