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

Comment trouver une chaîne dans une chaîne dans SQL Server

Dans SQL Server, vous pouvez utiliser T-SQL CHARINDEX() fonction ou la fonction PATINDEX() fonction pour trouver une chaîne dans une autre chaîne. Voici un aperçu rapide de chaque fonction.

La fonction CHARINDEX()

Cette fonction accepte 3 arguments; la chaîne à rechercher, la chaîne à rechercher et une position de départ facultative.

Le CHARINDEX() la syntaxe ressemble à ceci :

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

expressionToFind est l'expression que vous voulez trouver dans l'autre chaîne, et expressionToSearch est l'autre chaîne. Le start_location facultatif peut être utilisé pour spécifier une position dans expressionToSearch pour lequel commencer la recherche.

Notez que seule la position de la première occurrence est renvoyée.

Exemple

Voici un exemple :

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

Résultat :

1

Dans cet exemple, le premier argument est Bob , ce qui signifie que nous recherchons le deuxième argument pour Bob . Le résultat est 1 car c'est la position où Bob apparaît en premier dans le deuxième argument.

Vous remarquerez peut-être aussi que Bob apparaît en fait deux fois dans la chaîne, mais seule la position de la première correspondance est renvoyée.

Aucune correspondance

Si le deuxième argument ne contient pas Bob le résultat aurait été 0 .

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

Résultat :

0

Spécifier une position de départ

Vous pouvez spécifier une position de départ pour commencer la recherche. Cela signifie que SQL Server ignorera toute occurrence qui précède cette position de départ. Cependant, les résultats sont toujours rapportés en fonction de sa position dans la chaîne (et non à partir de la position de départ).

Si cela vous semble confus, l'exemple suivant devrait vous aider :

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

Résultat :

17

Donc, dans cet exemple, nous commençons la recherche à la position 16 (qui se trouve être l'espace avant le 2ème Bob ). Le résultat est que la première occurrence de Bob est sauté et la position du second est renvoyée. Et nous pouvons voir que sa position est de 17 caractères à partir du début de la chaîne (même s'il n'y a qu'un seul caractère à partir duquel nous avons commencé la recherche).

Sensibilité à la casse

Vous pouvez explicitement effectuer une recherche sensible à la casse en ajoutant la clause COLLATE à votre instruction SELECT :

Sensible à la casse

Voici une recherche sensible à la casse :

SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);

Résultat :

0

Ceci est sensible à la casse car _CS signifie sensible à la casse.

Insensible à la casse

Et voici une recherche insensible à la casse :

SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);

Résultat :

11

Ceci est insensible à la casse car _CI signifie Insensible à la casse.

La fonction PATINDEX()

Le PATINDEX() la fonction fait un travail similaire à CHARINDEX() . Vous avez essentiellement le choix de celui à utiliser. La principale différence réside dans la syntaxe.

Le PATINDEX() la syntaxe de la fonction ressemble à ceci :

PATINDEX ( '%pattern%' , expression )

motif est une expression de caractère qui contient la séquence à rechercher, et expression est l'expression à rechercher (généralement une colonne).

Le PATINDEX() accepte les caractères génériques, mais pas une position de départ. CHARINDEX() d'autre part accepte une position de départ, mais pas les caractères génériques.

Exemples

Voici un exemple :

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

Résultat :

12

Cependant, voici ce qui se passe lorsque nous n'incluons pas les caractères génériques :

SELECT PATINDEX('eer', 'Bob likes beer.');

Résultat :

0

Voici un autre exemple où nous introduisons un autre caractère générique :

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

Résultat :

11

Dans ce cas, le trait de soulignement (_ ) qui est un joker pour n'importe quel caractère unique.