2013-08-27 10 views
6

Mam tabeli z kolumną z łańcuchów, które looke tak:Oracle SQL - częściowe usunięcie duplikat z ciągiem

static-text-here/1abcdefg1abcdefgpxq 

Od tego ciągu 1abcdefg powtarza się dwa razy, więc chcę, aby usunąć ten ciąg częściowy, i powód:

static-text-here/1abcdefgpxq 

Nie mogę zagwarantować długości łańcucha powtórzeń. W czystym SQL, w jaki sposób można wykonać tę operację?

+2

Co zrobić, jeśli występuje wiele powtórzeń? Co z takimi rzeczami jak "aaaa"? Czy to 'aa' dwa razy następuje po' a' (w wyniku czego 'aaa') lub czy' a' jest powtórzone 5 razy, powodując "a"? –

+1

@ m.buettner Nie ma wielu powtórzeń. "Ciąg, który się powtarza" rozpoczyna się zaraz po tekście statycznym i powtarza się dokładnie jeden raz. – Jeremy

Odpowiedz

2

Jeśli można zagwarantować minimalną długość łańcucha wielokrotnego, coś jak to będzie działać:

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

Wierzę, że to może być rozszerzona, aby spełnić Twoje sprawy z pewnym sprytem.

0

Wydaje mi się, że możesz naciskać SQL poza to, do czego jest zdolny/zaprojektowany. Czy możliwe jest programowe zajęcie się tą sytuacją w warstwie położonej pod warstwą danych, w której łatwiej można sobie z tym poradzić?

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

fiddle

+0

+1 To rozwiązanie działa również z PostgreSQL: http://www.sqlfiddle.com/#!1/85101/1 – kol

0

Funkcja REPLACE powinno wystarczyć, aby rozwiązać ten problem.

stół Test:

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'); 

Zapytanie:

SELECT text, REPLACE(text, '1abcdefg1abcdefg', '1abcdefg') AS text2 
FROM test; 

Wynik:

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 funkcji REPLACE nie jest w standardzie SQL99, ale większość DBMS ją wspierać. Przetestowałem to pod here i działa z MySQL, PostgreSQL, SQLite, Oracle i MS SQL Server.

+0

Powtarzasz tu ciąg powtarzający, podczas gdy może to być dowolny ciąg powtarzalny. – Jerry

+0

@Jerry Widzę. A zatem REPLACE wystarcza tylko wtedy, gdy istnieje tylko niewielka liczba możliwych łańcuchów, które mogą być powtórzonymi podłańcuchami, a wszystkie z nich są znane z góry. – kol