7

我有一个表,其中有一列字符串看起来像这样:

static-text-here/1abcdefg1abcdefgpxq

从这个字符串1abcdefg重复两次,所以我想删除那个部分字符串,然后返回:

static-text-here/1abcdefgpxq

我不能保证重复字符串的长度。在纯 SQL 中,如何进行这种操作?

4

4 回答 4

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

小提琴

于 2013-08-27T19:52:42.023 回答
3

如果您可以保证重复字符串的最小长度,则可以使用以下方法:

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

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

于 2013-08-27T20:19:12.287 回答
0

在我看来,您可能正在推动 SQL 超出其能力/设计的范围。您是否可以在位于数据层下方的层中以编程方式处理这种情况,这样可以更轻松地处理此类事情?

于 2013-08-27T19:36:55.330 回答
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 都支持它。我在这里对其进行了测试,它适用于 MySQL、PostgreSQL、SQLite、Oracle 和 MS SQL Server。

于 2013-08-27T19:54:53.153 回答