sql - 带有 null 的 SQL 行值表达式在 where-in 查询中失败
问题描述
我很难理解为什么当行值表达式中有空值时这个 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
。
解决方案
这里的问题是无法比较空值。因此,您需要将空值转换为某个值来比较它们。在下面的示例中,我已将它们转换为 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
推荐阅读
- php - 更改 SQL 模式或编辑查询?
- c# - 无法将字符串转换为 system.io
- python - 更新 tensorflow-gpu 后,为什么还要使用旧版本?
- wordpress - 致命错误:未捕获错误:调用未定义函数 mysql_error()
- ios - 如何将原型单元格中的 UISwitch 状态传递回 UITableView
- html - 无法将徽标图像的属性设置为响应式
- python-3.x - NotImplementedError: __deepcopy__() 仅在启用急切执行时可用
- apache-spark - 为什么 Spark 的重新分区没有将数据平衡到分区中?
- swift - 为什么 Swift 不是从扩展通用 where 子句调用函数?
- python - 在 Visual Studio Code 上调试 Python 时如何更改当前行?