Auswahl der Teil eines Feldes mit einem regex
Ich habe eine Tabelle, wo eine 3rd-party-Komponente speichert die urls, ich möchte nur die id
parameter dieser url.
Mit PHP kann ich es so machen:
$subject = "index.php?option=com_content&catid=2&id=456&view=article"; //mysql query result
$pattern = '*[&?]id=([0-9]+)*'; //matches either ?id=456 or &id=456
preg_match($pattern, $subject, $matches);
echo $matches[1];//prints 456
Die Anzahl abgestimmt wäre Teil einer neuen Abfrage:
SELECT name FROM table1 WHERE id=the_match
Nun, ich denke, es wäre viel schneller direkt über mysql, so etwas wie
SELECT name FROM table1 WHERE id = (SELECT REGEX_MATCH('*[&?]id=([0-9]+)*', '$1') FROM table2 WHERE uniquefield1 = 'fred')
Offensichtlich SELECT REGEX_MATCH('*[&?]id=([0-9]+)*', '$1') FROM table2 WHERE uniquefield1 = 'fred')
ist komplett erfunden, nur um zu sagen, dass ich möchten, wählen Sie die erste Gruppe abgestimmt von regex und es verwenden, um die WHERE
- Klausel arbeiten.
Ist es möglich, etwas zu tun, wie dies mit MySQL?
InformationsquelleAutor BackSlash | 2013-06-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, traurig zu sagen, dass MySQL nicht über eine Möglichkeit zum anwenden einer regex zu der Inhalt einer Spalte in einer SELECT-Klausel, nur eine WHERE-Klausel.
Aber Sie können gewöhnliche (nicht-regex) string-manipulation Funktionen. Wenn die Spalte, in der Sie Ihr kaufmännisches und-Zeichen getrennte parameter-string benannt ist
url
können Sie die id-Nummer mit diesem feinen string-Ausdruck, der findet Ihre id-Nummer.So, wenn Sie wollen eine Liste der
id
Werte aus derurl
Spaltentable1
können Sie dieseSELECT
Abfrage.Wie Sie sehen können, verwendet die regexp-suchen-Funktion zum suchen der entsprechenden Zeilen.
Es ist nichts schnell über diese. Regexp matching kann nicht ausschöpfen, einen MySQL-index. Wenn Sie die Wahl haben, laden Sie Ihre Tabelle mit der Spalte " id " pre-extrahiert Sie werden viel besser aus suchen, wenn Ihre Tabelle groß wird.
WHERE
- Klausel?bitte siehe mein edit
Meine Spalte ist benannt
origurl
, so habe ich versucht, diesesSELECT CAST(RIGHT(origurl, LENGTH(origurl) - 3 - LOCATE('&id=', origurl)) AS INTEGER) AS id FROM j_sefurls WHERE origurl REGEXP '&id=[0-9]+'
sagt er, #1064 - Sie haben einen Fehler in Ihrer SQL-syntax; Lesen Sie im Handbuch, das entspricht Ihrer MySQL-server-version für den richtigen syntax in der Nähe ') ALS id AUS j_sefurls WO origurl REGEXP '&id=[0-9]+' LIMIT 0, 30' in Zeile 1Es ist für mich schwer zu Debuggen SQL, aber wenn ich das Ausschneiden und einfügen dieses statement in meinem test-system (MySQL 5.5) es geklappt hat.
Ich kann es nicht zu funktionieren
InformationsquelleAutor O. Jones
Möglich ist, dieses Paket zu benutzen: mysql-udf-regexp
Funktionen implementiert, die von diesem Paket sind:
Sehr ähnlich zu den Oracle-SQL-Funktionen.
InformationsquelleAutor Allan Andrade