Wildcards (jokers) dans une recherche

ezekiel056 Messages postés 18 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 11 décembre 2013 - 11 oct. 2013 à 15:24
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 18 oct. 2013 à 09:28
Bonjour,

Dans une requête de type Select, il est possible de faire une condition de type LIKE :

Ex: Select code from matable Where Nom Like "abc%"

Ceci donnerait donc la liste de tout les enregistrement dont Nom commencerait par ABC.

Je cherche cependant a compliquer un peu la chose mais je n'y arrive pas..

Imaginons cette liste de client :

LEBON
LE BON
LE BONNO
LEBONO
LEGROS
LE GROS
LEBILLO
LE BILLO

Ex de requête :
Select code from matable Where Nom Like "Le%B%O"
(pourrait se dire en français : Commençant par Le, avec un "B" plus loin avec un nombre de caractère indéfini entre les 2, finissant par O.)

Devrait sortir :
LEBON
LE BON
LE BONNO
LEBONO
LEBILLO
LE BILLO

Le but donc est de pouvoir inserer plusieur % .. où % represente un nombre non défini de caractères.. mais ça ne fonctionne pas.


Merci pour votre aide, cela fait un moment que je cherche une solution sans grands résultats :/

--

10 réponses

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
11 oct. 2013 à 16:30
salut salut !

Bien dommage qu'il n'y ai pas de section requêtage sur le forum =/. Ceci étant dit =p ...


Pour ma part je construirai ma requête de cette façon :
select code
from matable 
where UPPER(replace(Nom, ' ','')) like 'LEB%O'


car de ce que j'ai compris, au final tu souhaites juste ignorer les espace et ignorer la casse =).

à noter : n'oublie pas de mettre la valeur que tu recherche en majuscule. sinon tu peux aussi ecrire :
like UPPER('LEB%O')


Bien qu'il me semble que mysql ne soit pas sensible à la casse, mais à confirmer (je pense que c'est paramétrable).

naga
0
ezekiel056 Messages postés 18 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 11 décembre 2013
11 oct. 2013 à 16:37
Merci pour la réponse,

En fait j'ai l'habitude de poster sur un autre forum dédié au delphi... par reflexe j'ai pris la section delphi de CS.. mais effectivement, pour le coup je ne dois pas etre dans la bonne section -_-

Quoi qu'il en soit, j'ai besoin de pouvoir faire une requête générique qui ne s'appliquerait pas qu'a cet exemple.

Je ne souhaite donc pas ignorer que les espaces mais tous caractères se situant après %.

--
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
11 oct. 2013 à 17:38
ok !

Donc non ce que je disais c'est qu'il n'y a pas de section base de données ^^ donc tu as posté plus ou moins au bon endroit ;)


Ok donc en fait il faut que tu te tourne du côté regexp (fait une petit recherche, y a plein d'aide ^^).

Mais dans ton cas, il n'y a pas de raison pour que
"Le%B%O"  

ne passe pas.


et aussi tu dis :
(pourrait se dire en français : Commençant par Le, avec un "B" plus loin avec un nombre de caractère indéfini entre les 2, finissant par O.) 
Devrait sortir : 
LEBON 
LE BON 
LE BONNO 
LEBONO 
LEBILLO 
LE BILLO 


Je pense que tu t'es trompé, car les deux premiers ne finissent pas par 'O'.

Tu verra l'intérêt des regex surtout dans le cas où tu peux dire qu'il peu ou non y avoir des caractères entre deux autres, par exemple tu aurai ici :

"LE.*B.*O"
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
13 oct. 2013 à 22:35
Bonsoir,
select * from matable
where nom like "LE%" 
and nom like "%B%" 
and nom like "%O%"
and trim(nom) like "%O" 

C'est tout ce que tu peux faire
qui commence par LE et qui contient B (mais pas 1er car) et qui contient O (mais pas 1er) et qui termine par O.
Regarde ta doc sur la syntaxe du LIKE.
solilog
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
Modifié par nagashima le 14/10/2013 à 13:25
salut,
Il y a un petit soucis : tu perds l'ordre entre le B et le O (par exemple "LE OVIBO" fonctionnera alors que le résultat n'est pas attendu)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
Modifié par simonpelloquin le 14/10/2013 à 10:39
Bonjour,

Quand tu dis "mais ça ne fonctionne pas", pourrais tu préciser le SGBD que tu utilises et le message d'erreur rencontré (SQL ou/et Delphi) ?

Simon
0
ezekiel056 Messages postés 18 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 11 décembre 2013
14 oct. 2013 à 14:27
J'utilise une base mdb avec AdoQuery.
Je n'ai pas d'erreur, cela ne retourne tout simplement rien si on met plusieurs "%" dans le meme LIKE
0
ezekiel056 Messages postés 18 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 11 décembre 2013
14 oct. 2013 à 14:26
J'ai donc fait un petit algorithme qui va etudier toutes les possiblités saisies par l'utilisateur qui va generer la requete de type :

[code]
select * from matable
where nom like "LE%"
and nom like "%B%"
and nom like "%O%"
and trim(nom) like "%O"
/code

Ca fonctionne bien.. sauf que effectivement, du coup, on perd la notion d'ordre.
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
14 oct. 2013 à 15:18
regarde du côté des expressions régulières, tu peux être "mieux" (c'est pas très francais mais ca se comprend =p ) sélectif.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
14 oct. 2013 à 16:15
Salut,
Il semblerait donc que sous access (fichier MDB), le caractère joker soit * et non %... De même le caractère _ (joker mais que sur un seul caractère) est à remplacer par #.
A vérifier et à confirmer si tu peux...

Cf :
http://office.microsoft.com/en-us/access-help/examples-of-query-criteria-HA010066611.aspx?CTT=5&origin=HA010278156
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
14 oct. 2013 à 16:16
C'est pour ça aussi que je n'aime pas les bases access... imagine les problème lors d'une migration vers un autre SGBD... Enfin, c'est un autre sujet...
0
ezekiel056 Messages postés 18 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 11 décembre 2013
14 oct. 2013 à 18:12
Il faut bien utiliser des "%" en acces.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
15 oct. 2013 à 09:39
arf, comprends pas... sur ce site http://office.microsoft.com/en-us/access-help/access-wildcard-character-reference-HP005188185.aspx , on a "Select or update query Access database (.mdb file) ANSI-89" dans le tableau "About supported ANSI standards"...
La doc Microsoft ne serait pas à jour ?
D'ailleurs, je corrige ma remarque précédente, le "_" n'est pas à remplacer par "#" mais par "?"...
Je ne peux pas tester ça, n'ayant pas access sous la main, as tu quand même essayé avec "*" ?
0
ezekiel056 Messages postés 18 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 11 décembre 2013
17 oct. 2013 à 18:31
Oui, mais ca provoque une erreur de syntaxe avec des * a la place des '%'
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
14 oct. 2013 à 18:27
Salut

@ezekiel056:
Pour l'ordre, dans le SQL ANSI, il y a la fonction locate (idem à pos() dans Delphi), appelée aussi CHARINDEX (SQL serveur) ou POSITION (Firebird) ...

tu peux ajouter:
AND LOCATE("B",nom) < LOCATE("O", nom)
(B est avant O).

@simonpelloquin : oui le SQL ANSI et la majorité c'est _ (1 char) et % (n chars) contrairement à ACCESS.

solilog
0
ezekiel056 Messages postés 18 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 11 décembre 2013
14 oct. 2013 à 18:35
J'ai effectivement pensé a utiliser LOCATE de cette manière mais cela me retourne une erreur.

Peux être parce que j'utilise cela dans la fonction filter de Adoquery (je sais que la syntaxe diverge légèrement sur certains points..).

A essayer dans une requête simple.. mais bon, refaire une requête complète a chaque recherche.. ouch.. ce ne serait pas très optimisé.

--
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
Modifié par simonpelloquin le 18/10/2013 à 09:29
Alors, avant tout :

Select code from matable Where Nom Like "Le%B%O"

Ne te sortira pas LEBON et LE BON, puisque ta requête demande les noms qui se terminent par 'O'

Par ailleurs, j'ai testé cette requête sous Firebird, tu peux mettre autant de "%" que tu veux. Par contre, sur les clause where avec tes like, les valeurs à tester (avec les %) sont à mettre entre simples quotes (et non doubles, sinon, tu fais référence à d'autres noms de colonnes il me semble...).
Essaye ça :
Select code from matable Where Nom Like 'LE%B%O'
ou
Select code from matable Where Nom Like 'LE%B%O%' (si tu veux LEBON et LE BON...)
(et si tu as une erreur de syntaxe, essaie avec les étoiles à la place des pourcents)

Simon
0
Rejoignez-nous