LIKE (Transact-SQL)

Détermine si une chaîne de caractères donnée correspond à un modèle spécifié. Une chaîne peut comprendre des caractères normaux ainsi que des caractères génériques. Au cours de l'analyse, les caractères normaux doivent correspondre exactement aux caractères spécifiés dans la chaîne de caractères. Toutefois, les caractères génériques peuvent être associés à des portions aléatoires de la chaîne de caractères. L'utilisation de caractères génériques rend l'opérateur LIKE plus flexible que lorsque les opérateurs de comparaison des chaînes = et != sont utilisés. Si l'un de ces arguments n'est pas du type chaîne de caractères, le moteur de base de données SQL Server 2005 essaiera de le convertir.

Icône Lien de rubriqueConventions de la syntaxe de Transact-SQL

Syntaxe

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

Arguments

match_expression

Toute expression valide d'un type de données caractères.

pattern

Chaîne de caractères spécifique à rechercher dans match_expression. Peut inclure les caractères génériques valides suivants. Le paramètre pattern peut compter maximum 8 000 octets.

Caractère générique Description Exemple

%

Toute chaîne de zéro caractère ou plus.

WHERE title LIKE '%computer%' trouve tous les titres de livres comportant le terme « computer ».

_ (souligné)

N'importe quel caractère.

WHERE au_fname LIKE '_ean' trouve tous les prénoms en quatre lettres terminant par « ean » (Dean, Sean, etc.).

[ ]

Tout caractère de l'intervalle ([a-f]) ou de l'ensemble spécifié ([abcdef]).

WHERE au_lname LIKE '[C-P]arsen' trouve les noms d'auteurs terminant par « arsen » et commençant par un caractère compris entre C et P, tels que Carsen, Larsen, Karsen, etc.

[^]

Tout caractère en dehors de l'intervalle ([^a-f]) ou de l'ensemble spécifié ([^abcdef]).

WHERE au_lname LIKE 'de[^l]%' trouve tous les noms d'auteurs commençant par « de » et dont la lettre suivante n'est pas « l ».

escape_character

Caractère placé devant un caractère générique afin d'indiquer que ce dernier doit être interprété comme un caractère normal. Le paramètre escape_character est une expression de caractères sans valeur par défaut et qui doit s'évaluer à un seul caractère.

Notes

Lors de la comparaison de chaînes à l'aide de l'argument LIKE, tous les caractères de la chaîne modèle sont importants, y compris les espaces de début ou de fin. Si vous demandez une comparaison qui renvoie toutes les lignes contenant une chaîne LIKE « abc  » (abc suivi d'un seul espace), une ligne dont la valeur pour cette colonne est « abc » (abc sans espace) ne sera pas renvoyée. Les espaces à droite dont le profil correspond à l'expression ne sont pas pris en compte. Si vous demandez une comparaison qui renvoie toutes les lignes contenant une chaîne LIKE « abc » (abc sans espace), toutes les lignes commençant par la chaîne « abc », qu'elles contiennent ou non des espaces à droite, seront renvoyées.

Une comparaison de chaînes utilisant un modèle contenant des données de type char et varchar peut échouer lors d'une comparaison LIKE en raison du mode de stockage des données. Vous devez comprendre le stockage de chaque type de données et la cause possible de l'échec d'une comparaison LIKE. Dans l'exemple suivant, une variable locale de type char est transmise à une procédure stockée, puis l'on effectue une recherche générique pour trouver tous les employés dont le nom commence par un jeu de caractères donné.

USE AdventureWorks;
GO
CREATE PROCEDURE FindEmployee @EmpLName char(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT c.FirstName, c.LastName, a.City
FROM Person.Contact c JOIN Person.Address a ON c.ContactID = a.AddressID
WHERE c.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO

Dans la procédure FindEmployee, aucune ligne n'est renvoyée car la variable char (@EmpLName) contient des espaces à droite en fin de chaîne pour chaque nom comprenant moins de 20 caractères. Comme la colonne LastName est de type varchar, elle ne contient aucun espace à droite. Cette procédure échouera car les espaces de droite sont significatifs.

L'exemple suivant réussira car les espaces de droite en fin de chaîne ne sont pas ajoutés à une variable varchar.

USE AdventureWorks;
GO
CREATE PROCEDURE FindEmployee @EmpLName varchar(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT c.FirstName, c.LastName, a.City
FROM Person.Contact c JOIN Person.Address a ON c.ContactID = a.AddressID
WHERE c.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';

Voici l'ensemble des résultats.

FirstName         LastName              City       
---------- ----------------------------------------
Angela             Barbariol            Snohomish
David              Barber               Snohomish

(2 row(s) affected)

Recherche générique à l'aide de LIKE

Le mot clé LIKE prend en charge la recherche générique ASCII ainsi que la recherche générique Unicode. Lorsque tous les arguments (match_expression, pattern et escape_character, le cas échéant) sont des types de données de caractères ASCII, une recherche générique ASCII est effectuée. Si l'un des arguments est de type de données Unicode, tous les arguments sont convertis en Unicode et une recherche générique Unicode est effectuée. Lors de l'utilisation des données Unicode (types de données nchar ou nvarchar) avec LIKE, les espaces de droite sont significatifs ; pour les autres données, cependant, ils ne le sont pas. Unicode LIKE est compatible avec la version standard de SQL-92. ASCII LIKE est compatible avec les versions antérieures de SQL Server.

Voici une série d'exemples illustrant les différences dans les lignes renvoyées entre une recherche générique ASCII LIKE et une recherche générique Unicode LIKE.

-- ASCII pattern matching with char column
CREATE TABLE t (col1 char(30));
INSERT INTO t VALUES ('Robert King');
SELECT * 
FROM t 
WHERE col1 LIKE '% King'   -- returns 1 row

-- Unicode pattern matching with nchar column
CREATE TABLE t (col1 nchar(30));
INSERT INTO t VALUES ('Robert King');
SELECT * 
FROM t 
WHERE col1 LIKE '% King'   -- no rows returned

-- Unicode pattern matching with nchar column and RTRIM
CREATE TABLE t (col1 nchar (30));
INSERT INTO t VALUES ('Robert King');
SELECT * 
FROM t 
WHERE RTRIM(col1) LIKE '% King'   -- returns 1 row
ms179859.note(fr-fr,SQL.90).gifRemarque :
Les comparaisons LIKE sont affectées par le classement. Pour plus d'informations, consultez COLLATE (Transact-SQL).

Utilisation du caractère générique %

Si le symbole LIKE « 5% » est spécifié, Moteur de base de données recherche le nombre 5 suivi d'une chaîne de zéro caractère ou plus.

Par exemple, la requête suivante affiche toutes les vues de gestion dynamique dans la base de données AdventureWorks, parce qu'elles commencent par les lettres dm.

USE AdventureWorks;
GO
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO

Pour voir tous les objets qui ne sont pas des vues de gestion dynamique, utilisez NOT LIKE 'dm%'. S'il existe 32 objets au total et que LIKE extrait 13 noms correspondant au modèle, NOT LIKE trouvera 19 objets ne correspondant pas au modèle LIKE.

Il se peut qu'une recherche telle que LIKE '[^d][^m]%' ne vous renvoie pas toujours les mêmes noms. Au lieu de 19 noms, il se peut que vous n'en trouviez que 14 (tous les noms commençant par d ou dont la deuxième lettre est m sont exclus des résultats) avec, en prime, le nom des vues de gestion dynamique. Ce résultat est dû au fait que les chaînes correspondantes avec des caractères génériques de négation sont évaluées par étapes, un caractère générique après l'autre. Si la correspondance échoue à l'une des étapes de l'évaluation, la chaîne de caractères est exclue des résultats.

Utilisation de caractères génériques comme termes littéraux

Vous pouvez utiliser les caractères génériques comme termes littéraux. Pour utiliser un caractère générique en tant que terme littéral, mettez-le entre parenthèses. Le tableau ci-après propose plusieurs exemples d'utilisation du mot clé LIKE et des caractères génériques [ ].

Symbole Description

LIKE '5[%]'

5%

LIKE '[_]n'

_n

LIKE '[a-cdf]'

a, b, c, d ou f

LIKE '[-acdf]'

-, a, c, d, ou f

LIKE '[ [ ]'

[

LIKE ']'

]

LIKE 'abc[_]d%'

abc_d et abc_e

LIKE 'abc[def]'

abcd, abce et abcf

Recherche générique avec la clause ESCAPE

Vous pouvez rechercher des chaînes de caractères comprenant un ou plusieurs caractères génériques particuliers. À titre d'exemple, la table discounts de la base de données customers peut stocker les valeurs de remises comprenant un pourcentage (%). Pour rechercher un pourcentage en tant que caractère et non en tant que caractère générique, le mot clé ESCAPE et le caractère d'échappement doivent être fournis. Par exemple, une base de données exemple contient une colonne dénommée comment comprenant la chaîne 30 %. Pour rechercher les lignes contenant la chaîne 30 % n'importe où dans la colonne comment, spécifiez une clause WHERE telle que WHERE comment LIKE '%30!%%' ESCAPE '!'. Si le mot clé ESCAPE et le caractère ne sont pas spécifiés, Moteur de base de données renvoie toutes les lignes comprenant la chaîne 30.

Si le modèle LIKE ne contient aucun caractère après un caractère d'échappement, il n'est pas valide et le mot clé LIKE renvoie la valeur FALSE. Si le caractère se trouvant après un caractère d'échappement n'est pas un caractère générique, le caractère d'échappement est annulé et le caractère suivant est traité comme un caractère normal. Il s'agit notamment du signe de pourcentage (%), du trait de soulignement (_) et du crochet gauche ([) lorsqu'ils sont placés entre deux crochets ([ ]). En outre, à l'intérieur des doubles crochets ([ ]), les caractères d'échappement peuvent être utilisés et l'accent circonflexe (^), le trait d'union (-) et le crochet (]) droit peuvent être transformés en caractères d'échappement.

Types de résultats

Boolean

Valeur des résultats

LIKE renvoie TRUE si expression_match correspond au pattern spécifié.

Exemples

A. Utilisation de LIKE avec le caractère générique %

L'exemple suivant renvoie tous les numéros de téléphone comportant l'indicatif 415 dans la table Contact.

USE AdventureWorks;
GO
SELECT FirstName, LastName, Phone
FROM Person.Contact
WHERE phone LIKE '415%'
ORDER by LastName;
GO

Voici l'ensemble des résultats.

FirstName               LastName              phone
-----------------       ----------------      ------------
Ruben                   Alonso                415-555-0124
Shelby                  Cook                  415-555-0121
Karen                   Hu                    415-555-0114
John                    Long                  415-555-0147
David                   Long                  415-555-0123
Gilbert                 Ma                    415-555-0138
Meredith                Moreno                415-555-0131
Alexandra               Nelson                415-555-0174
Taylor                  Patterson             415-555-0170
Gabrielle               Russell               415-555-0197
Dalton                  Simmons               415-555-0115

(11 row(s) affected)

B. Utilisation de NOT LIKE avec le caractère générique %

L'exemple ci-après renvoie tous les numéros de téléphone de la table Contact dont l'indicatif n'est pas 415.

USE AdventureWorks;
GO
SELECT FirstName, LastName, Phone
FROM Person.Contact
WHERE Phone NOT LIKE '415%' AND FirstName = 'Gail'
ORDER BY LastName;
GO

Voici l'ensemble des résultats.

FirstName              LastName         Phone
---------              ----------       -------------------
Gail                   Alexander        1 (11) 500 555-0120
Gail                   Butler           1 (11) 500 555-0191
Gail                   Erickson         834-555-0132
Gail                   Erickson         849-555-0139
Gail                   Griffin          450-555-0171
Gail                   Moore            155-555-0169
Gail                   Russell          334-555-0170
Gail                   Westover         305-555-0100

(8 row(s) affected)

C. Utilisation de la clause ESCAPE

L'exemple suivant utilise la clause ESCAPE et le caractère d'échappement pour trouver la chaîne de caractères exacte 10-15% dans la colonne c1 de la table mytbl2.

USE tempdb;
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'mytbl2')
   DROP TABLE mytbl2;
GO
USE tempdb;
GO
CREATE TABLE mytbl2
(
 c1 sysname
);
GO
INSERT mytbl2 VALUES ('Discount is 10-15% off');
INSERT mytbl2 VALUES ('Discount is .10-.15 off');
GO
SELECT c1 
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO

D. Utilisation des caractères génériques [ ]

L'exemple suivant renvoie les Contacts dont le prénom est Cheryl ou Sheryl.

USE AdventureWorks;
GO
SELECT ContactID, FirstName, LastName 
FROM Person.Contact 
WHERE FirstName LIKE '[CS]heryl';
GO

L'exemple ci-après renvoie les lignes de Contacts dont le nom est Zheng ou Zhang.

USE AdventureWorks;
GO
SELECT LastName, FirstName, Phone
FROM Person.Contact
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC, FirstName ASC;
GO

Voir aussi

Référence

Expressions (Transact-SQL)
Fonctions (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)

Aide et Informations

Assistance sur SQL Server 2005