oracle 如何将逗号更改为管道并删除重复项并修剪LISTAGG中的最后一个分隔符[重复]

gpnt7bae  于 2023-06-22  发布在  Oracle
关注(0)|答案(2)|浏览(113)
    • 此问题已在此处有答案**:

LISTAGG in Oracle to return distinct values(24回答)
8天前关闭
我有一个查询,其结果是:* (编辑:13.06.2023 12:30)*

|ID|USER_NAME           |
|--|--------------------|
|1 |A1,A1,A1,B12,B12,C32|
|2 |A1                  |
|3 |B12,C32             |
    • 查询以上结果:**
SELECT 
ID,
LISTAGG (user_name, ',') WITHIN GROUP (ORDER BY user_name )
From my_table
GROUP BY ID;
    • 我尝试用','替换'|'并删除重复项并修剪最后一个分隔符为:**
SELECT
ID,
RTRIM(REGEXP_REPLACE(LISTAGG (user_name, ',') WITHIN GROUP (ORDER BY user_name ), '([^,]+)(,|\1)+', '\1|'),'|') 
From my_table 
GROUP BY ID;
    • 输出为:**
|ID|USER_NAME   |
|--|------------|
|1 |A1|2|B12|C32|
|2 |A1          |
|3 |B12|C32     |
    • 编辑:**LISTAGG和REGEXP应该是一个长查询的一部分,而不是一个独立的SELECT(LISTAGG的输出应该是一个长查询的一列)。这个例子应该只显示我最终想要的输出。

user_name和ID % 1的第二个值不正确。
如何获得正确的值?查询中有什么错误?
谢谢你。

c9qzyr3d

c9qzyr3d1#

首先选择不同的值,然后将listagg应用于已经不同的数据集:

WITH
   temp
   AS
      (SELECT DISTINCT id, user_name
         FROM my_table)
  SELECT id, 
         LISTAGG (user_name, '|') WITHIN GROUP (ORDER BY user_name)
    FROM temp
GROUP BY id;
9vw9lbht

9vw9lbht2#

您可以使用collect聚合来获取不同的值,然后在集合上使用listagg

create table sample_table (id int, user_name varchar2(10))
begin
  insert into sample_table values(1, 'A1');
  insert into sample_table values(1, 'A1');
  insert into sample_table values(1, 'A1');
  insert into sample_table values(1, 'B12');
  insert into sample_table values(1, 'B12');
  insert into sample_table values(1, 'C32');
  insert into sample_table values(2, 'A1');
  insert into sample_table values(3, 'B12');
  insert into sample_table values(3, 'C32');
  insert into sample_table values(3, 'B12');
  commit;
end;/
with grouped as (
  select
    id,
    cast(collect(distinct user_name) as sys.odcivarchar2list) as qwe
  from sample_table
  group by id
)
select
  id,
  (
    select
      listagg(column_value, '|') within group(order by column_value) as user_name
    from table(grouped.qwe)
  ) as user_name
from grouped

| ID|用户名|
| - -----|- -----|
| 1| A1| B12| C32|
| 2| A1|
| 3| B12| C32|
fiddle

相关问题