【问题标题】:SQL Server where column in where clause is nullSQL Server where 子句中的列为空
【发布时间】:2014-01-21 01:47:00
【问题描述】:

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

我想显示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

请帮帮我。

【问题讨论】:

  • 查询将返回 Weather 与用户输入的内容相似或 Weather 为空的行。您是说用户输入的内容除了 'sunny' 之外什么都不想返回,甚至是 null 值?
  • 是的,没错。
  • 没看懂你的要求!!!
  • 在这种情况下,您需要有一个有效天气值列表并在数据库中对其进行验证,或者在调用数据库的客户端中验证 - 在调用数据库之前 - 他们已经输入在有效的天气值中。
  • 似乎很复杂(我有一个很大的数据库),如果我没有找到好的解决方案,我会尝试。谢谢。

标签: sql sql-server null where-clause


【解决方案1】:

对于将NULLs 视为匹配项的一般任务,您的查询是正确的。如果您希望在没有其他结果时抑制 NULLs,可以在查询中添加 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')+'%'))

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

您也可以使用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 为空的值(假设用户输入了错误的 Sunny)。

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

【讨论】:

    猜你喜欢
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2017-07-20
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多