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.
on 05.03.2008 15:23
on 06.03.2008 11:33
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
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 !
on 06.03.2008 16:42
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
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.
on 06.03.2008 18:08
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
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.
on 07.03.2008 09:43
Oups, j'avais oublié de marquer [RESOLU]...