2009-07-21 8 views
0

Le set-upopérations d'expression régulière MySQL

Une table MySQL appelée "mytable" a un champ VARCHAR "data".

Le champ contient une chaîne dans le format de:

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

Je suis au courant de ces données est dénormaliser - j'ai été forcé d'utiliser "comme délimité puisque c'est le seul caractère n'est pas autorisé en tant que nom ou valeur.

Voici quelques exemples de données:

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

Le problème

Je suis en train de sélectionner des lignes de "mytable" basé sur une paire nom/valeur. Par exemple, je voudrais sélectionner toutes les lignes qui dans leur champ de données, ont un nom de «quatre» et une valeur correspondante inférieure à .1. (Cela devrait retourner les lignes 1 et 2).

Je voudrais le faire en une seule étape. Je me rends compte que je peux dénormaliser les données et assez facilement le faire de cette façon, mais je préférerais ne pas le faire. Cette opération ne se fera que sur 500 lignes maximum, donc je ne m'inquiète pas trop de ses performances.

Pour les entrées de nom $ et la valeur de $, je suppose la solution ressemblerait à quelque chose comme:

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

Le problème est, je ne connais pas les détails de la façon de le faire.

En espérant que quelqu'un puisse vous aider. Merci!

+0

Est-il vraiment pas d'autre moyen façon de faire des expressions régulières dans MySQL autres que d'une manière qui retourne 1 ou 0? –

Répondre

2

laid, mais je pense que cela fonctionne:

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

Merci pour votre réponse! Je suis étonné qu'il n'y ait pas de fonction d'expression régulière dans MySQL qui renvoie une correspondance plutôt qu'un 1 ou un 0. –