在Oracle中搜索JSON数组

a_h*_*ame 15 sql arrays oracle json oracle12c

我正在尝试使用Oracle 12.1.0.2中引入的新JSON功能

但是我似乎找不到在JSON文档中查找数组中特定值的方法.

请考虑以下表格和数据:

create table orders
(
   id      integer not null primary key,
   details clob not null check (details is json (strict))
);

insert into orders (id, details) values 
(1, '{"products": [{ "product": 1, "quantity": 5}, {"product": 2, "quantity": 1}], "delivery_address": "My hometown"}');

insert into orders (id, details) values 
(2, '{"products": [{ "product": 42, "quantity": 1}, {"product": 10, "quantity": 2}], "comment": "Your website is too slow"}');

insert into orders (id, details) values 
(3, '{"products": [{ "product": 543, "quantity": 1}], "discount": "15"}');

insert into orders (id, details) values 
(4, '{"products": [{ "product": 738, "quantity": 12}], "discount": "32"}');
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试编写一个返回所有订单的SQL查询,其中订购了产品#2.

我无法使用,json_exists因为它不允许数组表达式(我不知道如何指定值).

json_value 只返回一个值,所以我不能"迭代"数组值.

我试过了:

select *
from orders o
where json_value(details, '$.products[*].product') = '2';
Run Code Online (Sandbox Code Playgroud)

但这没有回报任何东西.

我也尝试过json_table,但似乎也只是从数组中取出第一个元素:

select *
from orders o, 
     json_table(o.details, '$' columns (product_id integer path '$.products[*].product')) t
where t.product_id = 2;
Run Code Online (Sandbox Code Playgroud)

但这没有任何表现.显然," array_step "中的"星形扩展" 并未扩展其中的值json_table

所以我的问题是:

我如何(根据上面的示例数据)检索订购了数字2的产品的所有订单?

我基本上寻找相当于这个Postgres查询:

select *
from orders
where details @> '{"products": [{"product": 2}] }';
Run Code Online (Sandbox Code Playgroud)

Pet*_*ell 18

我现在没有任何oracle安装,但我相信json_table中的第一个字符串应该是我们想要从中生成行的数组的路径.然后在COLUMNS内部,路径应该是相对于数组而不是根.

试试这个:

select *
from orders o, 
     json_table(o.details, '$.products[*]' 
         columns (
              product_id integer path '$.product'
         )
     ) t
where t.product_id = 2;
Run Code Online (Sandbox Code Playgroud)