当前位置: 首页 > 知识库问答 >
问题:

Oracle查询中json数组的分组

薛利
2023-03-14

我有Oracle表:

CREATE TABLE jsonarray_test 
(id VARCHAR2(50) PRIMARY KEY, 
json_array_str VARCHAR2(256), 
group_name VARCHAR2(50));

数据

INSERT ALL 
INTO jsonarray_test (id, group_name, json_array_str) values ('af1470c6-4883-454a-9cec-10cdd99c4446', 'sales', '["foo", "bar"]')
INTO jsonarray_test (id, group_name, json_array_str) values ('f310a5e0-b881-42d0-a4af-b6d1e9064676', 'sales', '["foo1", "bar"]')
INTO jsonarray_test (id, group_name, json_array_str) values ('688effbb-b665-4c58-b42a-be073823ec27', 'engineering', '["foo", "bar1"]')
SELECT 1 FROM DUAL;

Oracle是否支持产生以下输出的查询?--删除重复并将其分组到单个JSON数组中

sales       ["foo", "foo1", "bar"]
engineering ["foo", "bar1"]

版本: Oracle数据库12c企业版发布12.2.0.1.0-64位生产

共有1个答案

韩乐湛
2023-03-14

从Oracle 12c开始,您可以使用json_table()来重新嵌套json数组:从那以后,您可以删除重复的元素,最后使用集合函数json_arrayagg()来重建数组:

select 
    group_name, 
    json_arrayagg(val order by val) new_json_array_str
from (
    select group_name, val
    from 
        jsonarray_test j,
        json_table(j.json_array_str, '$[*]' columns(val varchar2(10) path '$')) t
    group by group_name, val
) x
group by group_name

请注意,由于某种原因,在我看来似乎是一个bug,您确实需要group by来正确消除重复项:select distinct似乎不起作用(DUP仍然显示在结果数组中-至少在我的db FIDLE中)。

DB Fiddle上的演示:

GROUP_NAME  | NEW_JSON_ARRAY_STR  
:---------- | :-------------------
engineering | ["bar1","foo"]      
sales       | ["bar","foo","foo1"]
 类似资料:
  • 问题内容: 我在Oracle11g中有一个具有(id,parent_id)结构的表。 我想对其进行查询,以获取与这些ID各自分层链接的所有行,因此结果应为: 我一直在和上苦苦挣扎,现在,我所能得到的只是查询所需结果的一小部分: 我不想使用任何循环来获取完整的结果。 任何的想法 ? 最好的问候,J茅r么我Lefr猫re PS:在第一个答案之后编辑,注意到我忘记了一些我想要的结果… 问题答案: 您发布

  • 最近升级到使用PostgreSQL 9.3.1来利用JSON功能。在我的表中,我有一个json类型列,其结构如下: 就问题而言,这只是虚拟数据。 是否可以根据id查询电子邮件数组中的特定项目 差不多:“返回id=123的电子邮件)”?

  • 问题内容: 最近升级到使用PostgreSQL 9.3.1来利用JSON功能。在我的表中,我有一个json类型列,其结构如下: 就问题而言,这只是伪数据。 是否可以根据id在emails数组中查询特定项目? 差不多:“返回电子邮件,其中id = 123)”? 问题答案: 是的,这是可能的: 是您的表名,是JSON列的名称。

  • 问题内容: 对我来说,这是一个永无止境的话题,我想知道我是否会忽略某些事情。本质上,我在应用程序中使用两种类型的SQL语句: 具有“后备”限制的常规查询 排序查询和分页查询 现在,我们讨论的是针对具有几百万条记录的表的一些查询,再加上另外五个具有几百万条记录的表的查询。显然,我们几乎不希望全部获取它们,这就是为什么我们有上述两种方法来限制用户查询的原因。 情况1 确实很简单。我们只是添加了一个额外

  • 我尝试使用函数JSON\u array\u elements()卸载JSON数组,并尝试使用JSON\u array\u length(field\u name)计算数组的元素,但没有成功。我使用的是PostgreSQL 9.4.5。 我想查询元素“name”的结果,这是json类型数组field crew | json[]上保存的数据。

  • 您将如何在存储在列中的数组中搜索元素?(更新:另请参阅列的9.4更新答案。) 如果我有这样一个JSON文档,存储在名为blob的列中: 我想做的是: 并取出所有匹配的行。但这不起作用,因为