SQL 带空值的行值表达式在 where-in 查询中失败
SQL row value expression with null failing in where-in query
我很难理解为什么当行值表达式中存在空值时此 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)
)
查询未从下面 table 返回单个记录。我希望每个行值表达式都与一条记录完全匹配。我似乎 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
我很难理解为什么当行值表达式中存在空值时此 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)
)
查询未从下面 table 返回单个记录。我希望每个行值表达式都与一条记录完全匹配。我似乎 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