Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

CHARINDEX() vs PATINDEX() dans SQL Server - Quelle est la différence ?

Dans SQL Server, vous pouvez utiliser soit le CHARINDEX() fonction ou la fonction PATINDEX() fonction pour trouver une chaîne dans une chaîne. Ce sont des fonctions de chaîne Transact-SQL, et elles sont également disponibles sur les bases de données Azure.

À première vue, ces fonctions semblent faire exactement la même chose et, dans de nombreux cas, vous pouvez utiliser celle que vous préférez.

Cependant, il existe quelques distinctions qui pourraient dicter la fonction que vous décidez d'utiliser dans certains scénarios. Ceux-ci peuvent être résumés par ce qui suit :

  • PATINDEX() vous permet d'utiliser des caractères génériques pour rechercher des modèles. CHARINDEX() pas.
  • CHARINDEX() accepte un troisième argument qui vous permet de spécifier la position de départ de la recherche. PATINDEX() pas.

Plus de détails sur ces points ci-dessous.

Définition

Examinons d'abord la définition officielle de chaque fonction.

CHARINDEX()
Recherche une expression de caractère dans une deuxième expression de caractère, renvoyant la position de départ de la première expression si elle est trouvée.
PATINDEX()
Renvoie la position de départ de la première occurrence d'un modèle dans une expression spécifiée, ou des zéros si le modèle n'est pas trouvé, sur tous les types de données texte et caractère valides.

Syntaxe

Et voici la syntaxe officielle de chaque fonction.

CHARINDEX()

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

PATINDEX()

PATINDEX ( '%pattern%' , expression )

Ainsi, les deux fonctions vous permettent de rechercher une expression de caractère, cependant le PATINDEX() la fonction vous permet de rechercher un motif . Il s'agit donc d'une fonctionnalité supplémentaire que vous n'obtenez pas avec le CHARINDEX() une fonction. Avec PATINDEX() vous pouvez utiliser des caractères génériques pour spécifier un modèle à rechercher, ce qui peut être très pratique dans certaines situations.

Cependant, CHARINDEX() accepte trois arguments alors que PATINDEX() n'en accepte que deux. Le CHARINDEX() La fonction accepte un troisième argument facultatif qui vous permet de spécifier la position de départ de la recherche. En d'autres termes, le CHARINDEX() La fonction vous permet de renvoyer uniquement les correspondances qui se produisent après un certain point dans la chaîne.

Exemples

Voici des exemples qui illustrent les fonctionnalités supplémentaires fournies par chaque fonction.

CHARINDEX()

Ici, je fournis un troisième argument pour spécifier une position pour commencer la recherche. Dans ce cas, il ignorera la première occurrence de Bob et il renverra la position de la deuxième occurrence.

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Résultat :

17

Donc, comme mentionné, vous ne pouvez pas faire cela avec PATINDEX() car il n'accepte pas ce troisième paramètre.

PATINDEX()

Voici maintenant un exemple de quelque chose que vous pouvez faire avec PATINDEX() que vous ne pouvez pas faire avec CHARINDEX() . Dans cet exemple, nous utilisons des caractères génériques pour rechercher un modèle :

SELECT PATINDEX('%b_er%', 'Bob likes beer.');

Résultat :

11

Dans ce cas, nous utilisons les signes pourcentage (% ) qui sont des caractères génériques pour indiquer que n'importe quel nombre de caractères peut continuer et succéder à notre chaîne de recherche. Nous utilisons également le trait de soulignement (_ ) qui est un joker pour tout simple caractère.

Conclusion

Ainsi, alors que CHARINDEX() et PATINDEX() offrent des fonctionnalités similaires, et dans de nombreux cas, l'un ou l'autre peut être utilisé à la place de l'autre, il y a des moments où vous devrez utiliser l'un plutôt que l'autre.

Plus précisément, vous utiliseriez CHARINDEX() lorsque vous souhaitez spécifier une position de départ dans la chaîne à rechercher. Et vous utiliseriez PATINDEX() chaque fois que vous avez besoin de spécifier un modèle à rechercher.