Oracle SQL - 从字符串中删除部分重复

时间:2013-08-27 19:17:33

标签: sql regex oracle

我有一个表格,其中包含一个字符串,如下所示:

static-text-here/1abcdefg1abcdefgpxq

从此字符串1abcdefg重复两次,所以我想删除该部分字符串,并返回:

static-text-here/1abcdefgpxq

我无法保证重复字符串的长度。在纯SQL中,如何执行此操作?

4 个答案:

答案 0 :(得分:7)

regexp_replace('static-text-here/1abcdefg1abcdefgpxq', '/(.*)\1', '/\1')

fiddle

答案 1 :(得分:2)

如果你能保证重复字符串的最小长度,那么这样的事情就可以了:

select REGEXP_REPLACE
   (input, 
   '(.{10,})(.*?)\1+', 
   '\1') "Less one repetition" 
   from tablename tn where ...;

我相信这可以通过一些聪明来扩展以满足你的情况。

答案 2 :(得分:0)

在我看来,您可能正在推动SQL超出其能力/设计目标。您是否有可能在数据层下面以编程方式处理这种情况,这样可以更容易地处理这类事情?

答案 3 :(得分:0)

REPLACE功能应足以解决问题。

测试表:

CREATE TABLE test (text varchar(100));

INSERT INTO test (text) VALUES ('pxq');
INSERT INTO test (text) VALUES ('static-text-here/pxq');
INSERT INTO test (text) VALUES ('static-text-here/1abcdefgpxq');
INSERT INTO test (text) VALUES ('static-text-here/1abcdefg1abcdefgpxq');

查询:

SELECT text, REPLACE(text, '1abcdefg1abcdefg', '1abcdefg') AS text2
FROM test;

结果:

TEXT                                    TEXT2
pxq                                     pxq
static-text-here/pxq                    static-text-here/pxq
static-text-here/1abcdefgpxq            static-text-here/1abcdefgpxq
static-text-here/1abcdefg1abcdefgpxq    static-text-here/1abcdefgpxq

AFAIK REPLACE函数不在SQL99标准中,但大多数DBMS都支持它。我测试了它here,它适用于MySQL,PostgreSQL,SQLite,Oracle和MS SQL Server。