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().
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 ?
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)
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)”
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 “?”