Oracle:SQL将字符串中的项目替换为另一个字符串中的项目

时间:2018-11-29 18:03:12

标签: sql string oracle replace regexp-replace

我有一个列“ col1”,例如:'a,b,x,y,z'(有序字符串)

另一列“ col2”类似于:'a,x'或'b,y,z'(有序字符串)

“ col2”中的所有字符串值均由子查询生成。因此它不是恒定的。

但是,“ col1”中的值是恒定的。那就是col1 ='a,b,x,y,z'

create table test (col1 varchar2(20), col2 varchar2(10)); 

insert into test values ('a,b,x,y,z','a,x');

insert into test values ('a,b,x,y,z','b,y,z');

需要有关替换一个sql的帮助。


需要帮助将“ col1”上的元素替换为“ col2”。

例如

when col2='a,x', the result should be : 'b,y,z'

when col2='b,y,z', the result should be : 'a,x'

2 个答案:

答案 0 :(得分:2)

这是一种有趣的方法:

select col1, col2,
       ltrim(regexp_replace(translate(replace(col1,','),','||replace(col2,','),',')
                            ,'(.)',',\1'),',') as col3
from   test;

也就是说:(从内而外读取执行时的函数调用)

  • 从两个字符串中删除逗号
  • 使用TRANSLATE()从第一个字符串中删除第二个字符串的字符
  • 使用REGEXP_REPLACE在其余字符串的每个字符之前添加逗号
  • 修剪逗号逗号

答案 1 :(得分:0)

这是一个选择;我加入了ID列以使其更简单。我希望您的 real 案例中存在与之相似的列。

想法是:

  • 将每一列(i <C-Q> * <Esc>:q!<CR><Tab><Tab>" quit without saving with C-q i <C-S> * <Esc>:wq!<CR><Tab><Tab>" save and exit files with C-s i <C-Y> * <Esc>:set list!<CR>:set number!<CR>i i <MiddleMouse> * :set paste<CR><S-Ins>:set nopaste<CR> col1)拆分为行
    • CTE col2代表one的行
    • CTE col1代表two的行
  • 使用col2集运算符减去这两组行
  • 使用MINUS,汇总结果

LISTAGG