L'opérateur LIKE

Fabrice Constans

L'opérateur logique LIKE est bien connu des habitués de SQL. Mais êtes-vous sûr d'en connaitre toutes les subtilités ?
Au terme de ce tutoriel il n'aura plus de secret pour vous.

Commentez cet article : Commentez

- Titre : L'opérateur LIKE

- Auteur : Fabrice Constans

- Parution : 18 janvier 2010

- Mise à jour : 8 août 2011

- Licence : Copyright ® 2010 Fabrice Constans. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. La syntaxe

- III. Les jokers

- III-A. L'astérisque

- III-B. Le point d'interrogation

- III-C. Le dièse

- III-D. Les crochets

- III-D-1. Rechercher les caractères génériques

- III-E. Avec d'autres types de données

- IV. SQL et VBA

- V. Avec SQL Server

- VI. Conclusion

- Remerciements

I - Introduction

L'opérateur logique LIKE est un opérateur d'égalité strictement réservé aux chaines de type texte. Sa particularité est de pouvoir comparer des valeurs à un masque composé de caractères de substitution.

Cet opérateur peut être utilisé avec SQL, VBA ou encore dans des expressions.

II - La syntaxe

La syntaxe est simple.

Syntaxe LIKE

Chaine_à_comparer LIKE "masque de comparaison"
Ou
Chaine_à_comparer LIKE 'masque de comparaison'

D'un côté nous avons la valeur à comparer et de l'autre le masque.

La syntaxe est identique en SQL, VBA ou dans les expressions.

La négation se fait grâce à NOT.

NOT (Chaine_à_comparer LIKE "masque de comparaison")

III - Les jokers

Les jokers sont des caractères de substitution permettant de composer le masque. Ils sont combinables. En voici la liste :

? * [! - ,]

III-A - L'astérisque

L'astérisque * remplace plusieurs caractères.

Chaine_à_comparer LIKE "*"

*

Toute chaine

abc*

Toute chaine commençant par abc

*abc

Toute chaine finissant par abc

*abc*

Toute chaine contenant abc

III-B - Le point d'interrogation

Le point d'interrogation ? remplace un seul caractère quel qu'il soit : lettre, chiffre, caractère spécial.

Chaine_à_comparer LIKE "???"

?

Toute chaine contenant 1 caractère

abc?

Toute chaine commençant par abc avec 1 caractère à la fin.

?abc

Toute chaine commençant par 1 caractère et finissant par abc.

?abc?

Toute chaine contenant abc avec 1 caractère de part et d'autre.

???

Toute chaine contenant 3 caractères.

*???*

Toute chaine contenant 3 caractères contigus.

Comme le point d'interrogation remplace 1 caractère on peut en utiliser plusieurs à la suite dans un masque de comparaison.

III-C - Le dièse

Le caractère dièse # fonctionne comme le point d'interrogation mais remplace un chiffre, donc ni lettre, ni un caractère spécial.

Chaine_à_comparer LIKE "##.##"

III-D - Les crochets

Les crochets permettent de remplacer un caractère situé dans une plage particulière.

Chaine_à_comparer LIKE "[A-C,M,X-Z]10"

"[A -C]"

Le tiret - détermine une plage de caractères contigus entre 2 bornes. Ici A, B ou C.

"[A,C,E]"

La virgule, détermine une série de caractères. Ici A, C ou E.

"[A,M-O,Z]"

La combinaison des 2. Ici A, M, N, O ou Z.

"[!A-C,1]"

Exclut les caractères A, B, C et 1.

"[a-zA-Z0-9]"

Permet de rechercher un caractère alphanumérique (lettre minuscule, majuscule ou chiffre, pas les caractères spéciaux.

Avec les chiffres on utilise la même syntaxe et les 2 sont combinables.

Attention les plages de caractères doivent toujours être placées dans l'ordre croissant. Par exemple [A-C] est valide alors que [C-A] ne l'est pas, de même que [0-9] est vailde et [9-0] ne l'est pas. Pour déterminer l'ordre des caractères, consultez la table ASCII et réalisez des tests.

III-D-1 - Rechercher les caractères génériques

On peut être emmené à rechercher l'un des caractères génériques dans une chaîne. Quelques exemples dans le tableau suivant.

"*[?]"

Le point d'interrogation à la fin d'une phrase.

"[*]*"

Un astérisque au début d'une chaîne.

"[[]*[]]"

Une chaîne bornée par des crochets comme "[formulaires]" par exemple.

"* [#]"

Une chaîne finissant par le caractère #.

"*""*""*"

Une chaîne bornée par de doublequote comme "Château "La vieille vigne" Médoc" par exemple.

III-E - Avec d'autres types de données

Le LIKE peut fonctionner avec d'autres types de données mais les valeurs testées seront transformées en texte par Jet pour leur évaluation.

Par exemple avec des dates on peut rechercher des séries.

LIKE

Signification

Équivalent sans LIKE

"##/##/2009"

toutes les dates de 2009.

Year(date)=2009

"##/1#/2009"

les dates du 4e trimestre 2009.

Format(Date,"t")=4 (*)

"10/##/####"

Le 10 de chaque mois.

Day(date)=10

On peut trouver certains intérêts à utiliser un LIKE plutôt qu'une expression plus académique, mais attention aux résultats qui peuvent être surprenants et loin de vos attentes.

(*) t en SQL, q en VBA. On peut également utiliser la fonction DatePart().

IV - SQL et VBA

On peut utiliser le LIKE en SQL mais également avec VBA ou dans des expressions dans ACCESS. Il s'utilise de la même manière que sous SQL.

Le résultat de l'expression renvoie une valeur booléenne (true, false, 0, -1).

Quelques tests dans la fenêtre d'exécution de VBE démontrent l'utilisation de l'opérateur LIKE.

avec VBA

variable="ceci#est [la preuve] par 9 ?"
? variable LIKE "*[#]*[[]la preuve[]]*[0,9]?[?]"
Vrai

Avec SQL :

avec SQL

SELECT Id, Adresse FROM Table WHERE Adresse LIKE "* rue *";

V - Avec SQL Server

Le tableau ci-dessous donne la correspondance entre JET et SQL Server

JET

SQL Server

Signification

?

_

1 caractère

*

%

1 chaîne de caractères

#

aucun

1 caractère numérique

[]

[]

1 liste de caractères

[!]

[^]

L'exclusion d'un ou plusieurs caractères.

VI - Conclusion

En conclusion voici un opérateur bien utile en toute circonstance surtout par sa disponibilité hors de SQL. Pour en savoir plus sur les opérateurs SQL je vous suggère la lecture de l'excellent tutoriel de Jeannot45 (à paraitre). Et si LIKE vous laisse sur votre faim utilisez le REGEX qui est expliqué au travers de l'incontournable tutoriel de Caféine https://cafeine.developpez.com/access/tutoriel/regexp/

Remerciements

Remerciements à ARKHAM46, JEANNOT45, JPCHECK et Claude Leloup pour ses corrections.