2009-08-23 5 views
5

Posso abbinare e sostituire uno schema di testo in un MYSQL select?MYSQL: Cerchi l'equivalente di "regex" di Perl = ~ s/e/i/g => rigix in un MySQL Select


EDIT Per ora sembra che la risposta è: non può essere fatto, dal momento che non è possibile catturare ciò che è stato abbinato (dalla risposta Eric s'/ commenti). Per ora guarderò nell'aggiunta di una tabella di ricerca.


esempio semplificato:

La tabella di MySQL Coleridge detiene molte stringhe come:

text 
------------------------------------ 
In_Xanadu_did_Kubla_Khan 
A_stately_pleasure_dome_decree 
Where_Alph_the_sacred_river_ran 
Through_caverns_measureless_to_man 
Down_to_a_sunless_sea 

C'è un modo per esprimere la select

SELEZIONA text = ~ s/[^_] + _ (. *) _ [^ _] + $/\ 1/ come sostituito DA Coleridge

e ottenere

replaced 
________________________ 
Xanadu_did_Kubla 
stately_pleasure_dome 
Alph_the_sacred_river 
caverns_measureless_to 
to_a_s 

Attenzione: per

  1. L'espressione regolare s///I fornito è molto meno complicato di quello che il mondo reale DB contiene
  2. Purtroppo non posso 't normalizzare il DB ..

risposta

5

Non esiste un modo di regex per sostituire qualcosa in MySQL. È possibile abbinare in MySQL basato su RegEx (regexp), ma ciò non restituisce quale parte è abbinata, solo l'intera colonna che è. Ma, è possibile utilizzare replace in questo modo:

select replace(col, 'e', 'i') from tbl 

Ciò restituirà regex come rigix.

quanto riguarda il tuo esempio specifico, che avrebbe dovuto usare una combinazione di locate e substring:

select 
    substring(col 
     , locate('_', col)+1 
     , locate('_', reverse(col))-(len(col)-locate('_', col)-1)) 
from tbl 

La regola generale sulla manipolazione di stringhe/gestione a livello di database è: Keep it simple. RDBMS pensa in set, ed è lì che brillano. Tirare le singole manipolazioni delle stringhe non è nel loro punto debole. In quanto tale, nessun RDBMS ha funzioni di gestione delle stringhe veramente mature (e certamente non c'è alcuna coerenza tra le diverse). Se la tua espressione regolare è ragionevolmente complessa, è molto probabile che tu voglia gestirla semplicemente sul livello presentazione/app e non nel database.

+0

grazie. sfortunatamente la mia espressione regolare non può essere espressa così facilmente (a meno che non codifichi un caos contorto di blocchi IF/CASE di sei piedi di profondità). Avrò una parola con il DBA .. Potrei dover costruire una tabella di ricerca. – lexu

+0

Credo che la risposta corretta alla mia domanda sia nel tuo commento alla risposta di chao: Non puoi catturare ciò che è stato abbinato. – lexu

2

No, non puoi. MySQL supporta solo regex per la corrispondenza (RLIKE), non la sostituzione.

+4

Importante notare che non è possibile catturare ciò che è stato abbinato, solo che una colonna è stata abbinata. – Eric