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バージョン事前に
おかげ
ジェームズ
にこれは私の質問に答えます。ありがとう! (申し訳ありませんが、私は解決策としてこの答えをマークする方法を見つけることができませんでした)。 – james800