我有一个表格,其中包含一个字符串,如下所示:
static-text-here/1abcdefg1abcdefgpxq
从此字符串1abcdefg
重复两次,所以我想删除该部分字符串,并返回:
static-text-here/1abcdefgpxq
我无法保证重复字符串的长度。在纯SQL中,如何执行此操作?
答案 0 :(得分:7)
regexp_replace('static-text-here/1abcdefg1abcdefgpxq', '/(.*)\1', '/\1')
答案 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。