1

我的查询看起来基本上像

WITH DATA AS(
 SELECT fields
    FROM table
        WHERE [many conditions]
        AND NOT field1 = 'string'           
)

SELECT foo,
    bar,
    CASE
        WHEN field1 IS NULL THEN 'other_string'
        [other cases]
    END
FROM data

还有很多其他的事情,但这是不起作用的核心部分。这应该会给我很多结果。但是,该特定情况的结果为零;如果我删掉查询的其余部分并基本上只运行这个,它只是一个空表。

AND NOT field1 = 'string'似乎正在过滤掉 field1 为“字符串”的所有行,但也过滤掉了 field1 为空的所有行。如果 field1 为 null,那么field1 = 'string'应该评估 false(因为 null 不等于任何内容),因此NOT field1 = 'string'应该评估 true,并且这些行应该在查询中——对吗?

实际上不确定我正在使用的 Redash 前端后面运行的是什么 sql 实现,但我可以确定它是否相关。

4

2 回答 2

2

几乎所有与NULL回报的比较NULL。两个突出的例外是IS NULLand IS NOT NULL,它们返回“true”或“false”。

NULL具有非常简单的语义:

  • NOT NULL-->NULL
  • TRUE AND NULL-->NULL
  • FALSE AND NULL-->FALSE
  • TRUE OR NULL-->TRUE
  • FALSE OR NULL-->NULL

NULL如果您认为表示 *unknown" 值而不是缺失值,则语义更容易理解。

WHERE子句仅通过评估为“真”的行。因此,“假”和NULL被删除。请注意,CASE表达式也是如此。但是,CHECK表达式NULL视为“真”。好吧,没有人指责 SQL 的内部一致性。

你的表达是:

WHERE [many conditions] AND NOT field1 = 'string'    

field1这是什么时候NULL

WHERE [many conditions] AND NOT (NULL = 'string')
WHERE [many conditions] AND NOT (NULL)
WHERE [many conditions] AND NULL
WHERE NULL

很简单的逻辑。

注意:标准 SQL 有一个NULL安全的比较器,它是:

WHERE [many conditions] AND field1 IS DISTINCT FROM 'string'

一些数据库<=>用于此目的:

WHERE [many conditions] AND NOT field1 <=>'string'

在其他情况下,您需要更明确:

WHERE [many conditions] AND (field1 <> 'string' OR field1 IS NULL)
于 2021-02-04T20:58:16.540 回答
1

如果您NULL与 SQL 中的另一个值进行比较,结果将是NULL. 但是,当您显式比较时,将相应地考虑使用IS NULLIS NOT NULLNULL 值。

所以你的情况应该是

(NOT (field1 = 'string') OR field1 IS NULL)

或者可能更具可读性(<>意味着不等于):

(field1 <> 'string' OR field1 IS NULL)

在这里,您可以找到有关 SQL NULL 值的一些详细信息。

无法使用比较运算符(例如 =、< 或 <>)测试 NULL 值。我们将不得不使用 IS NULL 和 IS NOT NULL 运算符。

于 2021-02-04T18:20:35.863 回答