首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server where子句中的where列为空

SQL Server where子句中的where列为空
EN

Stack Overflow用户
提问于 2014-01-03 19:40:16
回答 1查看 12.9K关注 0票数 2

假设我们有一个名为Data的表,其中包含IdWeather列。该表中的其他列对此问题并不重要。Weather列可以为null。

我希望显示Weather满足某个条件的所有行,但如果weather中有空值,则显示空值。

到目前为止我的SQL:

代码语言:javascript
运行
复制
SELECT * 
FROM Data d
WHERE (d.Weather LIKE '%'+COALESCE(NULLIF('',''),'sunny')+'%' OR d.Weather IS NULL)

我的结果是错误的,因为如果条件不正确,该语句还会显示Weather为null的值(假设用户输入错误)。

我找到了类似的话题,但我没有找到合适的答案。SQL WHERE clause not returning rows when field has NULL value

请帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-03 19:48:14

对于将NULL%s视为匹配的常规任务,您的查询是正确的。如果您希望在没有其他结果时取消NULLs,则可以向查询添加AND EXISTS ...条件,如下所示:

代码语言:javascript
运行
复制
SELECT * 
FROM Data d
WHERE d.Weather LIKE '%'+COALESCE(NULLIF('',''),'sunny')+'%'
   OR (d.Weather IS NULL AND EXISTS (SELECT * FROM Data dd WHERE dd.Weather LIKE '%'+COALESCE(NULLIF('',''),'sunny')+'%'))

附加条件确保仅当存在其他匹配记录时,才将NULL视为匹配。

您还可以使用common table expression来避免重复查询,如下所示:

代码语言:javascript
运行
复制
WITH cte (id, weather) AS
(
    SELECT * 
    FROM Data d
    WHERE d.Weather LIKE '%'+COALESCE(NULLIF('',''),'sunny')+'%'
)
SELECT * FROM cte
UNION ALL
SELECT * FROM Data WHERE weather is NULL AND EXISTS (SELECT * FROM cte)

如果条件不正确,

语句还会显示Wether为null的值(假设用户输入了错误的sunny)。

这表明常量'sunny'来自最终用户的输入。如果是这种情况,则需要将查询参数化以避免SQL injection attacks

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20902826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档