ActiveRecord et Expressions Régulières S QL

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.

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 [email protected]:

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

Merci,

Christophe.


Baptiste

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 !

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 [email protected]:

“R 22/26/45”


Baptiste

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 [email protected]:

Christophe.

Posted via http://www.ruby-forum.com/.


Baptiste

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.

Oups, j’avais oublié de marquer [RESOLU]…

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.