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

7

我有一张表格,其中有一个包含字符串的列看起来像这样:

static-text-here/1abcdefg1abcdefgpxq

这个字符串中1abcdefg重复出现了两次,因此我想删除这部分字符串,并返回:

static-text-here/1abcdefgpxq

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


2
如果有多个重复怎么办?像 aaaaa 这样的东西呢?这是 aa 两次后跟着 a(结果为 aaa)还是 a 重复了 5 次,结果为 a - Martin Ender
1
@m.buettner,这里没有多个重复。 "重复的字符串"紧接着静态文本开始,并且仅重复一次。 - Jeremy
4个回答

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

fiddle


+1 这个解决方案也适用于PostgreSQL:http://www.sqlfiddle.com/#!1/85101/1 - kol

3
如果您能保证重复字符串的最小长度,那么这样做可以解决问题:

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

我相信通过一些巧妙的方法,这可以被扩展以满足您的情况。


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

据我所知,REPLACE函数不在SQL99标准中,但大多数DBMS都支持它。我在这里进行了测试,并且它可以在MySQL、PostgreSQL、SQLite、Oracle和MS SQL Server中使用。

你在这里硬编码了重复的字符串,而它可以是任何重复的字符串。 - Jerry
@Jerry 我明白了。所以 REPLACE 只有在可能的重复子字符串数量很少且全部预先已知时才足够使用。 - kol

0

在我看来,你可能正在超出SQL的能力/设计范围。你是否可以在数据层下方的层中以编程方式处理此情况,因为这种类型的情况可以更轻松地处理?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接