我有
POW,POW,POWPRO,PRO,PRO,PROUTL,TNEUTL,TNEUTL,UTL,UTLTNE,UTL,UTLTNE
我想
POW,POWPRO,PRO,PROUTL,TNEUTL,UTL,UTLTNE
我试
select regexp_replace('POW,POW,POWPRO,PRO,PRO,PROUTL,TNEUTL,TNEUTL,UTL,UTLTNE,UTL,UTLTNE','([^,]+)(,\1)+','\1') from dual
我得到输出
POWPROUTL,TNEUTL,UTLTNE,UTLTNE
但我希望输出是
POW,POWPRO,PRO,PROUTL,TNEUTL,UTL,UTLTNE
请帮帮我
3条答案
按热度按时间piztneat1#
两个解决方案只使用SQL,第三个解决方案使用一个小的/简单的PL/SQL函数,这使得最终的SQL查询非常短。
Oracle设置:
查询1:
输出:
查询二:
输出:
Oracle设置:
一个小的helper函数:
查询3:
或者(如果你只想传递一个值):
输出:
wfypjpf42#
下面提供的解决方案使用直接的SQL(没有PL/SQL)。它可以处理任何可能的输入字符串,并在适当的位置删除重复的字符串--它保持输入标记的顺序,无论该顺序是什么。它还删除连续的逗号(它从输入字符串中“删除空值”),同时正确处理空输入。请注意仅由逗号组成的输入字符串的输出,以及分别由两个空格和一个空格组成的“标记”的正确处理。
查询运行相对较慢;如果性能是一个问题,它可以重写为递归查询,使用“传统的”
substr
和instr
,这比正则表达式快得多。我创建的输入的结果:
eivnm1vs3#
这个功能对我来说很好。