如何对包含纯JSON数组的字段进行规范化,而不是在其中包含JSON数组的JSON对象?
CREATE TABLE j ( measurements CLOB CONSTRAINT ensure_json CHECK (measurements IS JSON) ); INSERT INTO j VALUES ('[{"start_time": 1234, "start_time": 5678}]');
我尝试过以下各种变体,导致语法错误:
SELECT s.* FROM j, json_table(j.measurements, ':q' COLUMNS (start_time INT PATH '$.start_time')) AS s; -- Where :q is '*', or '.', or '$.*', or '$' or '$.*' or '$.[*]'
如果您在JSON对象中有JSON数组,则此查询将成功规范化它:
INSERT INTO j VALUES ('{"foo": [{"start_time": 1234}, {"start_time": 5678}]}'); SELECT s.* FROM j, json_table(j.measurements, '$.foo[*]' COLUMNS (start_time INT PATH '$.start_time')) AS s; START_TIME 1234 5678
答案 0 :(得分:1)
JSON PATH表达式必须在查询编译时知道,它们不能在执行时动态提供,因此JSON PATH表达式必须是常量字符串,而不是绑定。
此外,我们不喜欢多次出现相同密钥的对象
然而,这就是你要找的东西
SQL> WITH
2 MY_TABLE AS
3 (
4 SELECT '[{"start_time": 1234},{"start_time": 5678}]' JSON_DOC
5 from DUAL
6 )
7 select START_TIME
8 from MY_TABLE,
9 JSON_TABLE (
10 JSON_DOC,
11 '$[*]'
12 COLUMNS
13 START_TIME number(4) path '$.start_time'
14 )
15 /
1234
5678
SQL>