簡體   English   中英

在 CONCAT DB2 中查找重復項

[英]Find duplicates in CONCAT DB2

TempTable(Ncol1, Ncol2) as 
(SELECT
   col1,
    SUBSTR(xmlserialize(xmlagg(xmltext(CONCAT( ', ', col2))) as VARCHAR(1024)), 3) AS ConcatCol2
    FROM Table A
    WHERE A.col2 IN ('A','B','C','D')
    and A.Date >= (select FirstDayMonth from dates)
    GROUP BY A.col1)

在表 A 中,列 col2 具有如下值:

A
B
C
D

我有上面的代碼,像這個ABCD這樣的concat但它只重復一個像這樣的值ABCDD 我在子查詢中嘗試了 DISTINCT ,就像我在此處的另一個主題中讀到的那樣,但是其他解決方案是什么?

謝謝!

試試LISTAGG(DISTINCT )

CREATE TABLE T(C VARCHAR(32))

INSERT INTO T VALUES ('A'),('B'),('B'),('C')

SELECT LISTAGG(DISTINCT C) WITHIN GROUP ( ORDER BY C) FROM T 

將返回

    1     
------
ABC   

您需要使用 DB2 11.1 或更高版本才能使用LISTAGG中的DISTINCT選項

使用LISTAGG(DISTINCT時, ORDER BY需要與 LISTAGG 子句相同

所以這有效

SELECT 
    col1
,   LISTAGG(DISTINCT CONCAT( ', ', col2)) WITHIN GROUP 
           (ORDER BY CONCAT( ', ', col2))
FROM TableA
WHERE
    col2 IN ('A','B','C','D')
GROUP BY
    col1

但是這個

SELECT 
    col1
,   LISTAGG(DISTINCT CONCAT( ', ', col2)) WITHIN GROUP 
           (ORDER BY               col2 )
FROM TableA
WHERE
    col2 IN ('A','B','C','D')
GROUP BY
    col1

得到

以下 position 中的 ORDER BY 子句中的表達式,或“ORDER BY”子句中以“CONCAT...”開頭的表達式無效。 原因代碼 =“2”.. SQLCODE=-214,SQLSTATE=42822

並且,正如預期的那樣,這在LISTAGG的手冊頁中有所說明

如果為 LISTAGG 指定了 DISTINCT,則 ORDER BY 規范的排序鍵必須匹配字符串表達式 (SQLSTATE 42822)。 如果 string-expression 被隱式轉換,則排序鍵必須顯式包含相應的匹配轉換規范。

暫無
暫無

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

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