使用couple separator *和elements separator |交换Oracle记录中的字段

时间:2010-11-24 17:23:55

标签: oracle plsql

在Oracle表中,我有COUPLES(字符串,数字)记录,因此分开:

Abc|3456*Def|7890*Ghi|9430*Jkl|3534

在前面的例子中,情侣是:

(Abc,3456)
(Def,7890)
(Ghi,9430)
(Jkl,3534)

我想修改每个记录交换每对夫妇的顺序(首先是数字,然后是字符串):

3456|Abc*7890|Def*9430|Ghi*3534|Jkl

一对夫妇的两个元素的分隔符是竖线(|)。 COUPLES之间的分隔符是星号(*)。

我怎样才能实现交换每对夫妇的目标?

提前感谢您的合作!

1 个答案:

答案 0 :(得分:4)

尝试使用正则表达式...现在你有两个问题:

select 
  cola, 
  regexp_replace(cola, '([^*|]*)\|([^*|]*)(\*|$)','\2|\1\3') as swapped_col
from (
  select '3456|Abc*7890|Def*9430|Ghi*3534|Jkl' cola from dual
)

基本上正则表达式是说搜索所有不是|的东西或者* *直到找到|,然后找到所有不是|的东西或者*直到找到字符串的*或结尾。然后交换这两位并使用您找到的最终分隔符(*或EOL)终止它。交换的位按圆括号分组,然后在替换字符串中,数字表示放在哪里...所以第二组括号的内容放在第一位,然后是一个垂直条,然后是第一组括号,然后是第三个。

默认情况下,REGEXP_REPLACE将替换它找到的每个模式并替换它