我有一个Oracle 11g XE数据库,并且有一个查询结果集:
ID Category 1 Cat1 1 Cat2 2 Cat3 2 Cat4
我想在逗号分隔的同一行中获得所有相关类别的不同ID,像这样
ID Categories 1 Cat1,Cat2 2 Cat3,Cat4
我以前使用过Postgres,并array_agg在那里提供了帮助。如何在Oracle 11g XE中获得相同的结果?
array_agg
除非您在存储过程中使用它来将输出另存为数组(或集合),否则使用的查询LISTAGG应该足够并提供相同的输出。
LISTAGG
select ID , LISTAGG(Category,',') WITHIN GROUP ( ORDER BY ID ) Categories FROM yourtable GROUP BY ID;
在oracle中,我们没有像这样的简单转换函数array_agg。但是,您可以创建用户定义的集合类型,然后使用CAST和COLLECT函数将其转换为NESTED TABLE以获得相同的所需输出。
CAST
COLLECT
NESTED TABLE
首先,创建一个集合TYPE。
TYPE
create or replace TYPE categorytype as TABLE OF VARCHAR2(20);
现在,运行此查询等效于使用string_agg或LISTAGG,尽管categories它是数组或 集合 ,而不是字符串。
string_agg
categories
select id, CAST ( COLLECT(Category) as categorytype ) categories FROM yourtable group by id; | ID | CATEGORIES | |----|------------| | 1 | Cat1,Cat2 | | 2 | Cat3,Cat4 |
演示