我有一个表,其中有一列字符串看起来像这样:
static-text-here/1abcdefg1abcdefgpxq
从这个字符串1abcdefg
重复两次,所以我想删除那个部分字符串,然后返回:
static-text-here/1abcdefgpxq
我不能保证重复字符串的长度。在纯 SQL 中,如何进行这种操作?
regexp_replace('static-text-here/1abcdefg1abcdefgpxq', '/(.*)\1', '/\1')
如果您可以保证重复字符串的最小长度,则可以使用以下方法:
select REGEXP_REPLACE
(input,
'(.{10,})(.*?)\1+',
'\1') "Less one repetition"
from tablename tn where ...;
我相信这可以通过一些巧妙的方式扩展以满足您的情况。
在我看来,您可能正在推动 SQL 超出其能力/设计的范围。您是否可以在位于数据层下方的层中以编程方式处理这种情况,这样可以更轻松地处理此类事情?
该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。