我对以下明显的矛盾感到困惑:
select json_extract_scalar('{"json_array":[{"array_field":"1"}]}',
'$.json_array') is null,
json_extract_scalar('{"json_array":[{"array_field":"1"}]}',
'$.json_array[0]') is null,
json_extract_scalar('{"json_array":[{"array_field":"1"}]}',
'$.json_array[0].array_field') is null
结果:
true true false
json_array
是NULL
怎么可能,但是突然进一步挖掘时,它突然返回非空值?
答案 0 :(得分:2)
这是因为您使用了json_extract_scalar
而不是json_extract
。如果json路径的目标不是标量,则json_extract_scalar
返回标量(不是像数组或对象这样的复合标量)或NULL。
比较这些表达式。区别在于,一个正在使用json_extract_scalar
,另一个正在使用json_extract
:
presto> select json_extract_scalar('{"json_array":[{"array_field":"1"}]}', '$.json_array'),
-> json_extract('{"json_array":[{"array_field":"1"}]}', '$.json_array');
_col0 | _col1
-------+-----------------------
NULL | [{"array_field":"1"}]
(1 row)