2013-08-27 14 views
6

Ho una tabella con una colonna con stringhe che looke come questo:Oracle SQL - rimuovere duplicati parziali da stringa

static-text-here/1abcdefg1abcdefgpxq 

Da questa stringa 1abcdefg viene ripetuta due volte, quindi voglio rimuovere tale stringa parziale, e restituire:

static-text-here/1abcdefgpxq 

Non posso garantire la lunghezza della stringa di ripetizione. In puro SQL, come può essere eseguita questa operazione?

+2

Cosa succede se ci sono più ripetizioni? Cosa con cose come 'aaaaa'? Questo 'aa' è seguito due volte da' a' (risultante in 'aaa') o è' a' ripetuto 5 volte, risultando in 'a'? –

+1

@ m.buettner Non ci sono più ripetizioni. La "stringa che si ripete" inizia subito dopo il testo statico e si ripete esattamente una volta. – Jeremy

risposta

2

Se si può garantire una lunghezza minima della stringa ripetuta, qualcosa di simile a questo dovrebbe funzionare:

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

Credo che questo può essere ampliato per soddisfare il vostro caso con una certa intelligenza.

0

Mi sembra che si possa spingere SQL oltre ciò che è in grado/progettato. È possibile gestire questa situazione a livello di codice nel livello che si trova sotto il livello dati in cui questo tipo di cose può essere gestito più facilmente?

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

fiddle

+0

+1 Questa soluzione funziona anche con PostgreSQL: http://www.sqlfiddle.com/#!1/85101/1 – kol

0

La funzione REPLACE dovrebbe essere sufficiente a risolvere il problema.

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

Query:

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

Risultato:

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 

per quanto ne so la funzione REPLACE non è nello standard SQL99, ma la maggior parte dei DBMS lo supportano. L'ho testato here e funziona con MySQL, PostgreSQL, SQLite, Oracle e MS SQL Server.

+0

Qui stai codificando la stringa ripetuta, mentre potrebbe trattarsi di qualsiasi stringa ripetuta. – Jerry

+0

@Jerry vedo. Quindi REPLACE è sufficiente solo quando ci sono solo un piccolo numero di stringhe possibili che possono essere la sottostringa ripetuta e tutte sono conosciute in anticipo. – kol