Oracle如何规范化Json数组

时间:2017-03-10 22:42:05

标签: json oracle

如何对包含纯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

1 个答案:

答案 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>