2009-08-23 6 views
5

Kann ich passen und ein Textmuster in einer MYSQL ersetzen wählen?MYSQL: Auf der Suche nach äquivalent von Perl "regex" = ~ s/e/i/g => rigix in einem MySQL-Select


EDIT Vorerst sieht es aus wie die Antwort lautet: nicht getan werden kann, , da Sie nicht erfassen können, was abgestimmt wurde (von Eric ‚s Antwort/Kommentare). Für jetzt werde ich in das Hinzufügen einer Nachschlagetabelle schauen.


Vereinfachtes Beispiel:

Die MySQL-Tabelle Coleridge viele Strings wie hält:

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 

Gibt es eine Möglichkeit die Auswahl

Text SELECT auszudrücken = ~ s/[^_] _ + (. *) _ [^ _] +/$ \ 1/ wie aus Coleridge ersetzt

Hinweis

und

replaced 
________________________ 
Xanadu_did_Kubla 
stately_pleasure_dome 
Alph_the_sacred_river 
caverns_measureless_to 
to_a_s 

Bitte setzen Sie sich:

  1. den regulären Ausdruck s///I vorgesehen ist viel weniger kompliziert als das, was die reale Welt enthält DB
  2. Leider kann ich ‚t die DB normalisieren ..

Antwort

5

Es gibt keinen regex Weg, etwas in MySQL zu ersetzen. Sie können in MySQL basiert auf RegEx (regexp) entsprechen, aber das nicht zurück, was Teil angepasst ist, nur die gesamte Spalte, die ist. Aber können Sie replace wie so verwenden:

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

Dies wird regex als rigix zurück.

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

Die allgemeine Regel auf Stringmanipulationen/Handling auf der Datenbank-Ebene ist:

Wie für Ihr konkretes Beispiel, würden Sie eine Kombination aus locate und substring verwenden müssen, um es einfach halten. RDBMS denken in Sets, und genau da glänzen sie. Das Ziehen einzelner String-Manipulationen ist nicht an ihrem Sweet Spot. Als solches hat kein RDBMS wirklich ausgereifte String-Handling-Funktionen (und es gibt sicherlich keine Konsistenz zwischen den verschiedenen). Wenn Ihre Regex relativ komplex ist, werden Sie wahrscheinlich nur auf der Präsentations-/App-Ebene und nicht in der Datenbank damit umgehen wollen.

+0

danke. Leider kann meine Regex nicht so einfach ausgedrückt werden (es sei denn, ich schreibe ein verschachteltes Durcheinander von IF/CASE Blöcken sechs Fuß tief). Ich werde ein Wort mit dem DBA haben. Ich muss vielleicht eine Lookup-Tabelle erstellen. – lexu

+0

Ich glaube, die richtige Antwort auf meine Frage ist in Ihrem Kommentar zu Chao's Antwort: Sie können nicht erfassen, was gepasst wurde. – lexu

2

Nein, das geht nicht. MySQL unterstützt nur reguläre Ausdrücke für den Abgleich (RLIKE), nicht ersetzt werden.

+4

Wichtig zu beachten, dass Sie nicht erfassen können, was übereinstimmte, nur dass eine Spalte übereinstimmte. – Eric