假设我们有一个名为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
为空的值(假设用户输入错误)。
我发现了类似的话题,但在那里我找不到合适的答案。 SQL WHERE clause not returning rows when field has NULL value
请帮帮我。
答案 0 :(得分:3)
您的查询对于将NULL
视为匹配的一般任务是正确的。如果您希望在没有其他结果时取消NULL
,则可以在查询中添加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'
来自最终用户的输入。如果是这种情况,您需要参数化查询以避免SQL injection attacks。