Sql WM_CONCAT重复项删除

Sql WM_CONCAT重复项删除,sql,oracle,oracle11g,string-aggregation,wm-concat,Sql,Oracle,Oracle11g,String Aggregation,Wm Concat,我有一张像下面这样的桌子 colA colB 12345 NHS,CDE,BCD 12345 NHS,ABC,DEF 需要以以下格式显示数据 colA colB 12345 NHS,ABC,BCD,CDE,DEF 我需要一个通用的解决方案来删除重复的NHS,它先出现,然后将剩余的单词按字母顺序排列。首先,不要使用WM_CONCAT,因为它没有文档记录,并且在最新版本12c中不再可用。看到和 因为您使用的是11

我有一张像下面这样的桌子

   colA       colB
   12345      NHS,CDE,BCD
   12345      NHS,ABC,DEF
需要以以下格式显示数据

   colA       colB
   12345      NHS,ABC,BCD,CDE,DEF
我需要一个通用的解决方案来删除重复的NHS,它先出现,然后将剩余的单词按字母顺序排列。

首先,不要使用WM_CONCAT,因为它没有文档记录,并且在最新版本12c中不再可用。看到和

因为您使用的是11g,所以可以使用Listag

下面的查询执行以下操作:

. 使用listag应用字符串聚合。 用于处理自定义排序的大小写表达式。 比如说,

SQL> WITH DATA AS(
  2      SELECT 12345 colA, 'NHS,CDE,BCD' colB FROM dual UNION ALL
  3      SELECT 12345 colA, 'NHS,ABC,DEF' colB FROM dual
  4      )
  5  SELECT cola,
  6    listagg(colb, ',') WITHIN GROUP(
  7  ORDER BY
  8    CASE colb
  9      WHEN 'NHS'
 10      THEN 1
 11      ELSE 2
 12    END, colb) colb
 13  FROM
 14    (SELECT DISTINCT cola,
 15      trim(regexp_substr(colb, '[^,]+', 1, LEVEL)) colb
 16    FROM DATA
 17      CONNECT BY LEVEL <= regexp_count(colb, ',')+1
 18    ORDER BY colb
 19    )
 20  GROUP BY cola
 21  /

      COLA COLB
---------- ------------------------------
     12345 NHS,ABC,BCD,CDE,DEF

正如@AlexPoole指出的编辑,缺少显式排序,以前的querysee编辑历史依赖于值的不同排序。

处理非规范化数据以生成非规范化数据?希望这是一个一次性的工作。如果你真的需要这一点,你可以考虑使用数组。如果是挑剔的话,我宁愿看到你的订单,包括实际的COLB值以及情况:按顺序CORB当“NHS”,然后1个2个结束,COLB现在工作,但依赖于不同的排序值,谁知道这可能会改变一天* 8 - @ AlxPooL好点,谢谢虽然内联视图中的ORDER BY在这里没有多大区别。不,我同意,我只是指Listag的ORDER BY子句。感谢Lalit和Alex的澄清。顺便问一下,有没有办法将NHS从order by中删除,这样我就可以编写一个通用查询。@RaghavaCh,使用SUBSTR提取第一个值,保留它,只聚合其他值,最后附加它们。为了理解,请从最里面的子查询开始,逐个执行上述解决方案中的每个子查询。查看结果集,您将了解如何概括查询。
WITH t AS
  (SELECT col1,wm_concat(col2) AS col2 FROM test1 GROUP BY col1
  ) , t1 AS
  ( SELECT DISTINCT col1, regexp_substr(col2, '[^,]+', 1, rownum) names
  FROM t
    CONNECT BY rownum <= LENGTH(regexp_replace(col2, '[^,]'))+1
  ORDER BY names
  )
SELECT col1,wm_concat(names) AS names FROM t1 GROUP BY col1