2017-06-09 12 views
0

Oracle(12cR2)jsonを使用していますが、特定の要素を含む配列をクエリする方法が見つかりませんでした。query json array with Oracle 12cR2 json features

CREATE TABLE json_array (
    id NUMBER NOT NULL, 
    array CLOB, 
    CONSTRAINT json_array_pk PRIMARY KEY (id), 
    CONSTRAINT json_array_chk_1 CHECK (array IS JSON) 
); 

INSERT INTO json_array (id, array) VALUES (1, '{"a":[1, 3]}'); 
INSERT INTO json_array (id, array) VALUES (2, '{"a":[2, 4, 6]}'); 
INSERT INTO json_array (id, array) VALUES (3, '{"a":[1, 2, 5]}'); 
INSERT INTO json_array (id, array) VALUES (4, '{"a":[2, 5]}'); 
INSERT INTO json_array (id, array) VALUES (5, '{"a":[5]}'); 
INSERT INTO json_array (id, array) VALUES (6, '{"a":[5, 2]}'); 


COMMIT; 

は、ドメイン索引を作成します:ここでは、テストコードがある

CREATE SEARCH INDEX idx_json_array ON json_array (array) FOR JSON; 

私は、配列要素2と5は、アレイ内にかかわらず、彼らの順序を含むすべての行を検索するSQLすなわちはず

SQL1:

0123私は多くのオプションを試してみましたID 3、4、6

で行を返しますID = 2、3、4、6

SQL2:含有

select * from json_array j -- return arrays containing 2 at index 1 
where json_exists(j.array, '$?(@.a[0] == 2 || @.a[0] == 5)'); 

==>戻り行2または5:ID = 2、

==> 2を含む行を返します、5、6

SQL3:

select * from json_array j -- return arrays containing 2 at index 1 
where json_exists(j.array, '$?(@.a[0] == 2 && @.a[0] == 5)'); 

==>何行を返さない

SQL4:

select * from json_array j -- returns arrays containing 2 OR 5 
where json_textcontains(j.array, '$.a', '[2,5]'); 

==> 2又は5を含むリターン行:ID = 2、3、4、5、6

SQL5:

select * from json_array j 
where json_textcontains(j.array, '$.a', '{[2] & [5]}'); 

==>は行を返します2前の5

で、2と5を含む私が欲しいものを返すだけSQLは次のとおりです。 SQL6:

select * from json_array j 
where json_textcontains(j.array, '$.a', '[2]') AND json_textcontains(j.array, '$.a', '[5]'); 

==> ID = 3、4、6

を返すしかし要素の数が増加すると、この溶液は、非常に面倒であることができます。

質問:SQL6は同じ結果を返す良いオプションがありますか?

テスト12cのR2用のOracleバージョン事前に

おかげ

ジェームズ

答えて

0

はこのヘルプをい...

SQL> with MY_TABLE as 
    2 (
    3 select 1 as ID, '{"a":[1, 3]}' as ARRAY 
    4  from DUAL 
    5 union all 
    6 select 2 as ID, '{"a":[2, 4, 6]}' as ARRAY 
    7  from DUAL 
    8 union all 
    9 select 3 as ID, '{"a":[1, 2, 5]}' as ARRAY 
10  from DUAL 
11 union all 
12 select 4 as ID, '{"a":[2, 5]}' as ARRAY 
13  from DUAL 
14 union all 
15 select 5 as ID, '{"a":[5]}' as ARRAY 
16  from DUAL 
17 union all 
18 select 6 as ID, '{"a":[5, 2]}' as ARRAY 
19  from DUAL 
20 ) 
21 select ID 
22 from MY_TABLE 
23 where json_exists(ARRAY,'$?(@.a == 2 && @.a == 5)') 
24/

     ID 
---------- 
     3 
     4 
     6 

SQL> 
+0

にこれは私の質問に答えます。ありがとう! (申し訳ありませんが、私は解決策としてこの答えをマークする方法を見つけることができませんでした)。 – james800