Ruby Forum Rails France > ActiveRecord et Expressions Régulières S QL

Posted by gers32 (Guest)
on 05.03.2008 15:23
(Received via mailing list)
Bonjour,

J'ai le code suivant :

    @mes_trucs = MonTruc.find(
      :all,
      :select => "ID, CODE",
      :conditions => conditions_list)

conditions_list est une liste contenant les éléments suivants :

[0]     code like ? and comp like ? and PRODUCT like '%R%' and
(PRODUCT like ? or PRODUCT like ?)
[1]     %74%
[2]     %98%
[3]     %22%
[4]     %25%

Je souhaiterais remplacer "PRODUCT like ?" dans conditions_list[0] par
une Expression Régulière Oracle, telle que :

"REGEXP_LIKE( PRODUCT, 'R[[:digit| |/]*?')"

où "?" serait remplacé par l'une des valeurs de conditions_list, tout
comme dans la première requête. Malheureusement, "?" est ici pris
littéralement...

Une solution possible serait d'utiliser MyThing.find_by_sql() et de
recréer la requête SQL entièrement ; mais j'espère que quelqu'un
pourra m'aider à conserver la forme MyThing.find().

Merci,

Christophe.
Posted by Baptiste Decroix (Guest)
on 06.03.2008 11:33
(Received via mailing list)
Bonjour
L'expression régulière te permet de définir un "moule" et de comparer
tes données à ce moule.
Pour tester plusieurs valeurs précises, comme ici, la seule solution
que je vois c'est de créer une chaine avec toutes tes valeurs
alternatives du genre [74|98|22|25] et de l'insérer dans ton moule.

R[[:digit| |/]*? ne veut rien dire:
- il manque 1 crochet ]
- le ? est un opérateur de quantification, ca veut dire 0 ou 1 fois le
caractère ou groupe précédent
De quelle forme exactement est ton code PRODUCT ?


2008/3/5 gers32 <cbu.kitry@gmail.com>:
>  conditions_list est une liste contenant les éléments suivants :
>
>  Merci,
>
>  Christophe.
>  >
>



--
Baptiste
Posted by Chris Gers32 (gers32)
on 06.03.2008 13:49
C'est justement parce que le ? n'a pas sa place ici que je fais appel à 
l'aide de la communauté.

En effet, "REGEXP_LIKE( PRODUCT, 'R[:digit| |/]*26')" va trouver tous 
les champs PRODUCT contenant un "R" suivi de zéro, un ou plusieurs 
chiffres, espaces ou "/", puis "26". Je souhaiterais remplacer "26" par 
un nombre dynamique, provenant d'un formulaire.

Le champ PRODUCT contient des chaînes alphanumériques ; ce qui 
m'intéresse ressemble à ceci (les nombres ne sont que des exemples) :
"R 26"
"R 22/26/45"

J'espère que c'est plus clair.

Christophe.

P.S. : oui, dans mon exemple original, j'avais mis un "[" de trop... 
mais étonamment, ça marchait !
Posted by Baptiste Decroix (Guest)
on 06.03.2008 16:42
(Received via mailing list)
Et avec ca ca ne marcherait pas?
tmp = params[:truc].join("|")
"REGEXP_LIKE( PRODUCT, 'R[:digit| |/]*["+ tmp +"]')"
Avec params[:truc] un tableau contenant tes nombres récupérés par 
formulaire.

Pas sur d'avoir exactement compris la forme de PRODUCT.
Tu connais tous les nombres séparés par des / ou seul le dernier 
t'interesse?
Si c'est forcément R suivi d'un espace, puis une suite de nombres
séparés par des /, la chaine suivante est plus exacte:
"REGEXP_LIKE( PRODUCT, 'R ([:digit:]/)*["+ tmp +"]')"


(je crois aussi qu'on doit écrire [:digit:] et non pas :digit)


2008/3/6 Chris Gers32 <list-incoming@andreas-s.net>:
>  "R 22/26/45"
>
>
>  >
>



--
Baptiste
Posted by Chris Gers32 (gers32)
on 06.03.2008 17:05
L'insertion des valeurs dans la chaîne marcherait si je construisais la 
requête entièrement pour la passer dans find_by_sql(). Mais ici, 
j'essayais de conserver l'utilisation de find() et donc de passer en 
paramètre :conditions sous forme de liste contenant :
1- la liste des conditions (avec le fameux "?")
2- chaque valeur qui doit remplacer "?"

Mais ceci n'est peut-être pas faisable...

Christophe.
Posted by Baptiste Decroix (Guest)
on 06.03.2008 18:08
(Received via mailing list)
Autant pour moi, je n'avais pas bien compris.
Le problème c'est pas que ? est pris littéralement, c'est qu'il met
entre quotes ce qu'il est censé remplacé. Donc ton expression
régulière est faussée.
Une solution (?)

[0]     code like ? and comp like ? and
( REGEXP_LIKE( PRODUCT, ?) OR
 REGEXP_LIKE( PRODUCT, ?) OR
 REGEXP_LIKE( PRODUCT, ?) )
[1]     "R ([:digit:]/)*98"
[2]     "R ([:digit:]/)*22"
[3]     "R ([:digit:]/)*25"

Mais je ne vois pas bien l'intérêt d'utiliser une expression régulière
si c'est pour rajouter des OR dans la requete SQL. Est-ce que ca ne
serait pas plus efficace?
[0]     code like ? and comp like ? and
REGEXP_LIKE( PRODUCT, ?)
[1]     "R ([:digit:]/)*(98|22|25)"


2008/3/6 Chris Gers32 <list-incoming@andreas-s.net>:
>  Christophe.
>  --
>
>
> Posted via http://www.ruby-forum.com/.
>
>  >
>



--
Baptiste
Posted by Chris Gers32 (gers32)
on 07.03.2008 09:41
Merci Baptiste. Je vais suivre tes deux conseils :
1- REGEXP_LIKE( PRODUCT, ?)
2- R([:digit]| |/)*(26|36)

Le premier point est la réponse à ma question originale.
Pour ce qui est du second point, je n'y avais pas pensé sur le coup car 
j'ai modifié une requête qui utilisait simplement PRODUCT LIKE ?, ce qui 
explique pourquoi j'en avais plusieurs séparés par OR.

Christophe.
Posted by Chris Gers32 (gers32)
on 07.03.2008 09:43
Oups, j'avais oublié de marquer [RESOLU]...