SQL Server where where子句中的列为null

时间:2014-01-03 11:40:16

标签: sql sql-server null where-clause

假设我们有一个名为Data的表,其中包含IdWeather列。该表中的其他列对此问题并不重要。 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

请帮帮我。

1 个答案:

答案 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