假设我们有一个名为Data
的表,其中包含Id
和Weather
列。该表中的其他列对此问题并不重要。Weather
列可以为null。
我希望显示Weather
满足某个条件的所有行,但如果weather
中有空值,则显示空值。
到目前为止我的SQL:
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
请帮帮我。
发布于 2014-01-03 19:48:14
对于将NULL
%s视为匹配的常规任务,您的查询是正确的。如果您希望在没有其他结果时取消NULL
s,则可以向查询添加AND EXISTS ...
条件,如下所示:
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来避免重复查询,如下所示:
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。
https://stackoverflow.com/questions/20902826
复制相似问题