2013-08-27 32 views
6

部分重複我有一個列的表與looke像這樣的字符串:的Oracle SQL - 刪除字符串

static-text-here/1abcdefg1abcdefgpxq 

從這個字符串1abcdefg重複兩次,所以我希望刪除部分字符串,並返回:

static-text-here/1abcdefgpxq 

我無法保證重複字符串的長度。在純SQL中,該操作如何執行?

+2

如果有多個重複?有什麼像'aaaaa'這樣的東西?那個'aa'兩次跟着'a'(導致'aaa')或者是'a'重複了5次,導致了'a'? –

+1

@ m.buettner沒有多個重複。 「重複的字符串」從靜態文本開始並重復一次。 – Jeremy

回答

2

如果你能保證重複的字符串的最小長度,像這樣的工作:

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

我相信這可以被擴展,以滿足一些聰明你的情況。

0

在我看來,你可能會推動SQL超越它的能力/設計。是否有可能以編程方式處理這種情況下的圖層,該圖層位於數據層之下,可以更輕鬆地處理此類事物?

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

fiddle

+0

+1此解決方案也適用於PostgreSQL:http://www.sqlfiddle.com/#!1/85101/1 – kol

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。

+0

您正在對重複字符串進行硬編碼,但它可能是任何重複的字符串。 – Jerry

+0

@Jerry我明白了。所以只有當只有少數可能的字符串可以是重複的子字符串時,REPLACE纔是足夠的,並且它們都是事先已知的。 – kol