2

我有一张如下表。

   colA       colB
   12345      NHS,CDE,BCD
   12345      NHS,ABC,DEF

需要以以下格式显示数据

   colA       colB
   12345      NHS,ABC,BCD,CDE,DEF

我需要通用解决方案来删除重复的 NHS,它首先出现,然后按字母顺序排列剩余的单词。

4

2 回答 2

2

首先,永远不要使用WM_CONCAT ,因为它没有文档记录,并且在最新版本 12c 中不再可用。请参阅为什么不在 Oracle 中使用 WM_CONCAT 函数?为什么wm_concat在这里不起作用?

由于您使用的是 11g,因此您可以使用LISTAGG

以下查询执行以下操作:

  1. 将逗号分隔的字符串拆分为 rows
  2. 使用LISTAGG应用字符串聚合。
  3. CASE表达式来处理自定义排序。

例如,

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 指出的那样,缺少显式排序,并且先前的查询(请参阅编辑历史记录)依赖于值的不同排序。

于 2015-05-14T07:08:08.807 回答
0
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
于 2015-05-14T07:26:11.743 回答