Получение значений из нескольких JSON в Oracle - PullRequest
0 голосов
/ 21 февраля 2019

Я бы хотел запросить некоторые данные, хранящиеся в json, в реляционной таблице Oracle.

create table Foo (
  id VARCHAR2(40) not null,
  data CLOB,
  constraint foo_pk primary key (id),
  constraint foo_json_chk check (data is json)
);

insert into Foo (id, data) values ('1', '{"id": "1", "name": "bar1"}');
insert into Foo (id, data) values ('2', '{"id": "2", "name": "bar2"}');

Я могу сделать запрос из одного json, используя json_table:

select name from json_table(
  (select data from Foo where id='1'),
  '$'
  COLUMNS (
    name PATH '$.name'
    )
);

Дает

+------+
| name |
+------+
| bar1 |
+------+

Если мы попытаемся выполнить запрос из нескольких строк:

select name from json_table(
  (
    select data from Foo --where id='1'
  ),
  '$'
  COLUMNS (
    name PATH '$.name'
    )
);

Я бы хотел получить все значения, соответствующие пути json.Для данных, хранящихся выше, это будет означать:

+------+
| name |
+------+
| bar1 |
| bar2 |
+------+

Позже я объединю этот запрос в соединении с другими таблицами в системе.

К сожалению, вместо этого я получаю следующую ошибку:

ORA-01427: single-row subquery returns more than one row

Я пробовал разные комбинации NESTED PATH и JSON_ARRAYAGG, но пока не повезло.

Как извлечь значения из нескольких строк, используя один и тот же путь json?

1 Ответ

0 голосов
/ 21 февраля 2019

Вам не нужен подзапрос в выражении json_table.Укажите исходную таблицу в предложении from:

select name 
from   foo, json_table(
  data , '$'
  columns (
    name PATH '$.name'
    )
);

NAME   
bar1   
bar2   
...