Oracle JSON Array запрос - PullRequest
       32

Oracle JSON Array запрос

0 голосов
/ 17 октября 2018

Моя версия: Oracle Database 12c Standard Edition, выпуск 12.1.0.2.0 - 64-разрядная версия

CREATE TABLE DUMMY1 (id  int NOT NULL PRIMARY KEY, doc1 VARCHAR2 (200) , doc2 VARCHAR2 (200), CONSTRAINT dummy_json1 CHECK (doc1 IS JSON) , CONSTRAINT dummy_json2 CHECK (doc2 IS JSON));

INSERT INTO DUMMY1 VALUES (1, '["12345", "23456", "34567"]', '["ABCD", "EFGH"]’);


select ID, t1.*, t2.* from DUMMY1 d, 
json_table(d.doc1, '$[*]' 
 columns (x VARCHAR2(10) PATH '$')) t1, json_table(d.doc2, '$[*]' 
 columns (x VARCHAR2(10) PATH '$')) t2 WHERE t1.x = ‘12345' AND t2.x='EFGH’;

Возвращает одну запись

select ID, t1.*, t2.* from DUMMY1 d, json_table(d.doc1, '$[*]' 
columns (x VARCHAR2(10) PATH '$')) t1, json_table(d.doc2, '$[*]' 
columns (x VARCHAR2(10) PATH '$')) t2 WHERE t1.x = '23456' AND t2.x='EFGH’;

Не возвращает строки.

select ID, t1.*, t2.* from DUMMY1 d, json_table(d.doc1, '$[*]' 
columns (x VARCHAR2(10) PATH '$')) t1, json_table(d.doc2, '$[*]' 
columns (x VARCHAR2(10) PATH '$')) t2;

Возвращает:

    ID X          X
---------- ---------- ----------
     1 12345      ABCD
     1 12345      EFGH
     1 23456      ABCD
     1 23456      EFGH
     1 34567      ABCD
     1 34567      EFGH

Я что-то пропустил?

Что я пытался сделать, это то, что у меня есть таблица, где 2 из ее столбцов являются массивом JSON, я хочувернуть результат, где 2 заданных значения существуют в массиве JSON, есть ли лучший способ сделать это?(так как я делаю это кросс-соединение)

1 Ответ

0 голосов
/ 17 октября 2018

Я бы избежал перекрестного продукта и использовал бы что-то вроде следующего ...

SELECT id
FROM   dummy1
WHERE  json_exists (
          doc1,
          '$[*]?(@ == "23456")')
AND    json_exists (
          doc2,
          '$[*]?(@ == "EFGH")');
...