以下明显的矛盾让我有点困惑:
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
,但当进一步挖掘时,它突然变成非空?
这是因为您使用了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)