簡體   English   中英

聚合和連接字符串而不重復

[英]Aggregate and concatenate strings without duplication

我想聚合字符串並連接它們。 這是我正在使用的示例

SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM   emp
GROUP BY deptno;

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK, CLARK,KING,MILLER, MILLER
        20 ADAMS, ADAMS, ADAMS, FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,MARTIN,TURNER,WARD

3 rows selected.

但是我希望結果在串聯字符串中不重復。

所需結果:

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 SMITH,FORD,ADAMS,SCOTT,JONES
        30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD

3 rows selected.

編輯:所以在下面的示例中有一些“用逗號分隔的員工姓名”。 它使用帶有正則表達式的建議答案:

with emp as (
select 10 as deptno, 'clark,1' as ename from dual
union all
select 10, 'clark,1' from dual
union all
select 10, 'clark,1' from dual
union all
select 10, 'bob' from dual
union all
select 10, 'bob' from dual
union all
select 10, 'don' from dual
union all
select 20, 'tim,2' from dual
union all
select 20, 'tim,2' from dual
union all
select 20, 'tim,2' from dual
union all
select 20, 'jack' from dual
union all
select 20, 'mark' from dual
)
SELECT e.deptno, --LISTAGG(e.ename, ',') WITHIN GROUP (ORDER BY e.ename) AS employees,
RTRIM(REGEXP_REPLACE(listagg (e.ename, ',') 
                     WITHIN GROUP (ORDER BY e.ename),
                     '([^,]+)(,\1)+', '\1'),
                     ',') AS employees
FROM   emp e
GROUP BY e.deptno;

該查詢的結果不正確:

在此處輸入圖片說明

更換

FROM   emp

FROM (SELECT DISTINCT deptno, ename FROM  emp)

(來自非Oracle用戶,但應該可以)

您可以使用REGEX:

SELECT   deptno, 
         rtrim( regexp_replace( (Listagg(ename,',') within GROUP (ORDER BY ename) OVER ()), '([^-]*)(-\1)+($|-)', '\1\3'), '-') within GROUP (ORDER BY ename) AS employees 
FROM     emp 
GROUP BY deptno;

這是使用交叉連接的方法

SELECT DISTINCT deptno, 
                b.enames 
FROM   emp a 
       cross join (SELECT Listagg(ename, '-') 
                            within GROUP (ORDER BY ename) enames 
                   FROM   (SELECT DISTINCT enam ename 
                           FROM   emp)) b 

讓我知道他們是否工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM