2009-07-21 26 views
0

Das Set-upMySQL regulären Ausdruck Operationen

A mysql table "Mytable" genannt hat eine VARCHAR Feld "Daten".

Das Feld enthält eine Zeichenfolge im Format:

name1'value1''name2'value2'' ... nameN''valueN 

Ich bin mir bewusst, diese Daten denormalized sind - ich habe zu verwenden "als begrenzt gezwungen, da dies das einzige Zeichen ist, dass ist nicht als Name oder Wert erlaubt.

Hier sind einige Beispieldaten:

one'.6332''two'.4231''three'.343''four'.034 
two'.4332''four'.033''five'.043 
four'.2323''seven'.3409''nine'.003 

Das Problem

Ich versuche zu wählen Zeilen aus "mytable", basierend auf einem Name/Wert-Paar. Zum Beispiel möchte ich alle Zeilen auswählen, die in ihrem Datenfeld den Namen "vier" und einen entsprechenden Wert kleiner als 0,1 haben. (Dies sollte Zeilen 1 und 2 zurückgeben).

Ich möchte dies in einem Schritt tun. Mir ist klar, dass ich die Daten denormalisieren kann und es ganz einfach so mache, aber das würde ich lieber nicht tun. Dieser Vorgang wird nur in höchstens 500 Reihen ausgeführt, daher bin ich nicht besonders besorgt über seine Leistung.

Für Eingänge $ name und $ value, gehe ich davon die Lösung etwas aussehen würde:

SELECT * FROM mytable WHERE 
    TO_INT(reg_ex(<crazyregex which selects $name>, data)) < $value 

Das Problem ist, ich weiß nicht, die Besonderheiten, wie dies zu tun.

In der Hoffnung, dass jemand helfen kann. Vielen Dank!

+0

Gibt es wirklich keine Möglichkeit, auf andere Weise reguläre Ausdrücke in MySQL anders als eine Art und Weise zu tun, die 1 oder 0 zurück? –

Antwort

2

hässlich, aber ich denke, es funktioniert:

CREATE TABLE t (d varchar(255)); 

INSERT INTO t (d) VALUES 
    ("one'.6332''two'.4231''three'.343''four'.034"), 
    ("two'.4332''four'.033''five'.043"), 
    ("four'.2323''seven'.3409''nine'.003"), 
    ("four'.011''five'.043"), 
    ("four'.100''seven'.3409''nine'.003") 
; 


SELECT 
    d, 
    convert(
    right(d, length(d) - instr(d, "four'")- 4), 
    decimal(5,4) 
) as v 
FROM t 
where d regexp "four'.0[0-9]*" 
; 
+0

Vielen Dank für Ihre Antwort! Ich bin erstaunt, dass es in MySQL keine Funktion für einen regulären Ausdruck gibt, die eine Übereinstimmung zurückgibt, anstatt eine 1 oder 0. –