在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之间的分隔符是星号(*)。
我怎样才能实现交换每对夫妇的目标?
提前感谢您的合作!
答案 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将替换它找到的每个模式并替换它