如何将字符串'ab,cd,ef'反转为'ef-> cd-> ab'

时间:2015-04-10 01:48:22

标签: sql string oracle reverse

当我从Oracle中选择表时,我想处理一个col'val: 例如:

'ab,cd,ef' to 'ef->cd->ab';
'AB,BC' to 'BC->AB';
'ACNN,BBCCAC' to 'BBCCAC->ACNN';
'BBBDC,DCCX,FFF' to 'FFF->DCCX->BBBDC'

2 个答案:

答案 0 :(得分:3)

我们有两项任务。第一种是对原始字符串进行标记。正则表达式很容易(尽管there are more performant approaches if you are dealing with large volumes)。第二个任务是以相反的顺序重新组装令牌;我们可以使用11gR2 LISTAGG()函数:

with tokens as (
    select distinct col1, regexp_substr(col1, '[^,]+', 1, level) as tkn, level as rn
    from t23
    connect by level <= regexp_count (col1, '[,]')  +1
   )
select col1
       , listagg(tkn, '->') 
            within group (order by rn desc) as rev_col1
from tokens
group by col1
/

这是a SQL Fiddle

答案 1 :(得分:0)

您可以将字符串拆分字符串聚合混合使用。

使用:

  • REGEXP_SUBSTR :将逗号分隔的字符串拆分为行
  • LISTAGG :汇总值

您可以查看一下本文,了解字符串拆分的工作原理http://lalitkumarb.wordpress.com/2015/03/04/split-comma-delimited-strings-in-a-table-using-oracle-sql/

SQL> WITH DATA AS(
  2  SELECT 1 ID, 'ab,cd,ef' text FROM dual UNION ALL
  3  SELECT 2 ID, 'AB,BC' text FROM dual UNION ALL
  4  SELECT 3 ID, 'ACNN,BBCCAC' text FROM dual
  5  )
  6  SELECT ID,
  7    listagg(text, ',') WITHIN GROUP (
  8  ORDER BY rn DESC) reversed_indices
  9  FROM
 10    (SELECT t.id,
 11      rownum rn,
 12      trim(regexp_substr(t.text, '[^,]+', 1, lines.COLUMN_VALUE)) text
 13    FROM data t,
 14      TABLE (CAST (MULTISET
 15      (SELECT LEVEL FROM dual CONNECT BY LEVEL <= regexp_count(t.text, ',')+1
 16      ) AS sys.odciNumberList ) ) lines
 17    ORDER BY ID
 18    )
 19  GROUP BY ID
 20  /

        ID REVERSED_INDICES
---------- ------------------------------
         1 ef,cd,ab
         2 BC,AB
         3 BBCCAC,ACNN

SQL>

假设您的表格如下:

SQL> SELECT * FROM t;

        ID TEXT
---------- ------------------------------
         1 ab,cd,ef
         2 AB,BC
         3 ACNN,BBCCAC
         4 word1,word2,word3
         5 1,2,3

SQL>

使用上述查询:

SQL> SELECT ID,
  2    listagg(text, '-->') WITHIN GROUP (
  3  ORDER BY rn DESC) reversed_indices
  4  FROM
  5    (SELECT t.id,
  6      rownum rn,
  7      trim(regexp_substr(t.text, '[^,]+', 1, lines.COLUMN_VALUE)) text
  8    FROM t,
  9      TABLE (CAST (MULTISET
 10      (SELECT LEVEL FROM dual CONNECT BY LEVEL <= regexp_count(t.text, ',')+1
 11      ) AS sys.odciNumberList ) ) lines
 12    ORDER BY ID
 13    )
 14  GROUP BY ID
 15  /

        ID REVERSED_INDICES
---------- ------------------------------
         1 ef-->cd-->ab
         2 BC-->AB
         3 BBCCAC-->ACNN
         4 word3-->word2-->word1
         5 3-->2-->1

SQL>