Как преобразовать json в столбцы и строки, используя табличную функцию oracle - PullRequest
0 голосов
/ 22 января 2020

У меня есть структура таблицы, как показано ниже:

create table json_tab (id number constraint primary key,d_data clob(30000));

insert into json_tab values (1,'[{"a"=0,"b"=1},{"a"=1,"b"=2},{"a"=2,"b"=3}]');
insert into json_tab values (2,'[{"a"=0,"b"=1},{"a"=1,"b"=2},{"a"=2,"b"=3}]');

I want to write a query to fetch records as below format.
id |a |b
---------
1  0  1
1  1  2
1  2  3
2  0  1
2  1  2
2  2  3

Выше приведены примерные данные, реальные данные для json могут быть больше 30000 байт

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Начнем с того, что ваш код SQL неверен ни для таблицы создания, ни для документа json. Вот исправленная версия:

drop table json_tab;
create table json_tab (id number  primary key,d_data clob check (d_data is json));
insert into json_tab values (1,'[{"a":0,"b":1},{"a":1,"b":2},{"a":2,"b":3}]');
insert into json_tab values (2,'[{"a":0,"b":1},{"a":1,"b":2},{"a":2,"b":3}]');

select j.id, t.a, t.b
from json_tab j, json_table (j.d_data columns (
        nested path '$[*]' COLUMNS(
            A NUMBER PATH '$.a',
            B number path '$.b'))) t;

А вот и вывод:

        ID          A          B
---------- ---------- ----------
         1          0          1
         1          1          2
         1          2          3
         2          0          1
         2          1          2
         2          2          3
1 голос
/ 22 января 2020

Вы можете создать свою таблицу как:

create table json_tab (
  id     NUMBER(8,0) CONSTRAINT json_tab__id__pk PRIMARY KEY,
  d_data CLOB        CONSTRAINT json_tab__d_data__json CHECK (d_data IS JSON)
);

Тогда ваши JSON данные должны использовать "a":1 вместо "a"=1 в парах ключ-значение объекта:

insert into json_tab ( id, d_data )
SELECT 1,'[{"a":0,"b":1},{"a":1,"b":2},{"a":2,"b":3}]' FROM DUAL UNION ALL
SELECT 2,'[{"a":0,"b":1},{"a":1,"b":2},{"a":2,"b":3}]' FROM DUAL;

Тогда вы можете использовать JSON_TABLE:

SELECT id,a,b
FROM   json_tab t
       CROSS JOIN
       JSON_TABLE(
         t.d_data,
         '$[*]'
         COLUMNS
           a NUMBER(5,0) PATH '$.a',
           b NUMBER(5,0) PATH '$.b'
       )

Какие выходы:

ID |  A |  B
-: | -: | -:
 1 |  0 |  1
 1 |  1 |  2
 1 |  2 |  3
 2 |  0 |  1
 2 |  1 |  2
 2 |  2 |  3

дБ <> Fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...