PATINDEX (Transact-SQL)

Renvoie la position de début de la première occurrence d'un modèle dans une expression spécifiée, ou des zéros si le modèle est introuvable, pour tous les types de données texte et caractère valides.

Icône Lien de rubrique Conventions de la syntaxe Transact-SQL

Syntaxe

PATINDEX ( '%pattern%' , expression )

Arguments

  • pattern
    Expression de caractères qui contient la séquence à rechercher. Les caractères génériques peuvent être utilisés ; toutefois, le caractère « % » doit précéder et suivre pattern (sauf lorsque vous recherchez les premiers ou derniers caractères). pattern est une expression de la catégorie de type de chaîne de caractères.

  • expression
    Est une expression, en général une colonne recherchée pour le modèle spécifié. expression appartient à la catégorie de type de chaîne de caractères.

Types de retour

bigint si expression est du type de données varchar(max) ou nvarchar(max) ; sinon int.

Notes

Si pattern ou expression est NULL, PATINDEX retourne NULL.

PATINDEX exécute ses comparaisons en se basant sur le classement de l'entrée. Pour exécuter une comparaison selon un classement spécifié, vous pouvez utiliser COLLATE pour appliquer à l'entrée un classement explicite.

Caractères supplémentaires (paires de substitution)

Lors de l'utilisation de classements SC, la valeur de retour compte toutes les paires de substitution UTF-16 dans le paramètre expression comme un caractère unique. Pour plus d'informations, consultez Prise en charge d'Unicode et du classement.

0x0000 (char(0)) est un caractère indéfini dans les classements Windows et ne peut pas être inclus dans PATINDEX.

Exemples

A.Utilisation d'un modèle avec la fonction PATINDEX

L'exemple suivant recherche la position de début du modèle ensure dans une ligne spécifique de la colonne DocumentSummary de la table Document.

USE AdventureWorks2012;
GO
SELECT PATINDEX('%ensure%',DocumentSummary)
FROM Production.Document
WHERE DocumentNode = 0x7B40;
GO 

Voici l'ensemble des résultats.

-----------

64

(1 row(s) affected)

Si vous ne limitez pas le nombre de lignes à explorer à l'aide d'une clause WHERE, la requête renvoie toutes les lignes de la table et fournit des valeurs différentes de 0 pour les lignes contenant le modèle et des valeurs égales à 0 pour toutes les lignes qui ne le contiennent pas.

B.Utilisation de caractères génériques avec la fonction PATINDEX

L'exemple suivant utilise les caractères génériques % et _ pour rechercher la position de début du modèle 'en', suivi de tout caractère et 'ure' dans la chaîne spécifiée (l'index démarre à 1) :

  SELECT PATINDEX('%en_ure%', 'please ensure the door is locked');
 

Voici l'ensemble des résultats.

------------

8

PATINDEX fonctionne comme LIKE ; vous pouvez donc utiliser chacun des caractères génériques. Il n'est pas nécessaire d'ajouter le modèle entre les pourcentages. PATINDEX('a%', 'abc') retourne 1 et PATINDEX('%a', 'cba') retourne 3.

Contrairement à LIKE, PATINDEX retourne une position, comme le fait CHARINDEX.

C.Utilisation de COLLATE avec PATINDEX

L'exemple qui suit utilise la fonction COLLATE pour spécifier explicitement le classement de l'expression recherchée.

USE tempdb;
GO
SELECT PATINDEX ( '%ein%', 'Das ist ein Test'  COLLATE Latin1_General_BIN) ;
GO

D.Utilisation d'une variable pour spécifier le modèle

L'exemple suivant utilise une variable pour passer une valeur au paramètre pattern.

USE AdventureWorks2012; 
GO
DECLARE @MyValue varchar(10) = 'safety'; 

SELECT PATINDEX('%' + @MyValue + '%', DocumentSummary) 
FROM Production.Document
WHERE DocumentNode = 0x7B40;

Voici l'ensemble des résultats.

------------

22

Voir aussi

Référence

Types de données (Transact-SQL)

Fonctions de chaîne (Transact-SQL)

[ ] (Caractère générique - recherche de correspondance de caractère(s)) (Transact-SQL)

[^] (Caractères génériques à ne pas faire correspondre - Transact-SQL)

_ (Caractère générique - recherche de correspondance d'un seul caractère) (Transact-SQL)

Caractère de pourcentage (caractères génériques à ne pas faire correspondre - Transact-SQL)