【问题标题】:SQL row value expression with null failing in where-in query带有 null 的 SQL 行值表达式在 where-in 查询中失败
【发布时间】:2021-08-22 05:32:06
【问题描述】:

我很难理解为什么当行值表达式中有空值时这个 where-in 查询会失败。

select * from
FOO
where (
  EPOCH,
  CURRENCY_CODE,
  PRICE_PROVIDER_CODE,
  MARKET_EXTERNAL_ID)
in (
  (1622736580084, 'USD', 'A', null),
  (1622736580085, 'USD', 'B', null),
  (1622736580086, 'USD', 'C', null)
) 

查询未返回下表中的单个记录。我希望每个行值表达式都与一条记录完全匹配。我似乎 null 破坏了乐趣,我不明白为什么。

EPOCH           CURENCY_CODE   PRICE_PROVIDER_CODE    MARKET_EXTERNAL_ID
------------------------------------------------------------------------
1622736580084            USD                     A                  NULL
1622736580085            USD                     B                  NULL    
1622736580086            USD                     C                  NULL

对于MARKET_EXTERNAL_ID 字段中具有非空值的行,它按预期工作。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql jooq


【解决方案1】:

这里的问题是不能比较空值。因此,您需要将空值转换为某个值来比较它们。在下面的示例中,我已将它们转换为 0。

注意:NVL 是 Oracle 专有的,coalesce 是标准功能。

SELECT
    *
FROM
    foo
WHERE
    ( epoch,
      currency_code,
      price_provider_code,
      nvl(market_external_id, 0) ) IN (
        ( 1622736580084,
          'USD',
          'A',
          0 ),
        ( 1622736580085,
          'USD',
          'B',
          0 ),
        ( 1622736580086,
          'USD',
          'C',
          0 )
    )

输出:

EPOCH           CURENCY_CODE   PRICE_PROVIDER_CODE    MARKET_EXTERNAL_ID
------------------------------------------------------------------------
1622736580084            USD                     A                  NULL
1622736580085            USD                     B                  NULL    
1622736580086            USD                     C                  NULL

【讨论】:

  • 谢谢!也许您可以提到 NVL 是 Oracle 专有的。大多数其他数据库上的等价物是coalesce
猜你喜欢
  • 2014-07-26
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2014-05-02
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多