Catégories :

Fonctions de chaîne et fonctions binaires (Correspondance/Comparaison)

CHARINDEX

Recherche la première occurrence du premier argument dans le deuxième argument et, si cela aboutit, retourne la position (basée sur 1) du premier argument dans le deuxième argument.

Alias

POSITION

Syntaxe

CHARINDEX( <expr1>, <expr2> [ , <start_pos> ] )

Arguments

Obligatoire :

expr1

Une chaîne ou une expression binaire représentant la valeur que nous recherchons.

expr2

Une chaîne ou une expression binaire représentant la valeur dans laquelle nous recherchons.

Facultatif :

pos_début

Un nombre indiquant la position à partir de laquelle commencer la recherche (avec 1 représentant le début de expr2).

Par défaut : 1

Notes sur l’utilisation

  • Si l’un des arguments est NULL, renvoie NULL.

  • Si la chaîne ou la valeur binaire est introuvable, renvoie 0.

  • Si pos_début facultatif spécifié se situe au-delà de la fin du deuxième argument (la chaîne dans laquelle nous effectuons une recherche), 0 est renvoyé.

  • Si le premier argument est vide (par exemple, une chaîne vide), renvoie 1.

  • Les types de données des deux premiers arguments devraient être les mêmes ; soit les deux arguments doivent être des chaînes, soit les deux arguments doivent être des valeurs binaires.

Détails du classement

Cette fonction ne fonctionne pas avec les spécifications de classement suivantes :

  • lower.

  • upper.

  • pi (insensible à la ponctuation).

  • cs-ai (sensible à la casse, insensible aux accents)

Exemples

Trouvez la première occurrence de “uzzy” dans “fuzzy wuzzy” :

SELECT CHARINDEX('uzzy', 'fuzzy wuzzy', 1);

+-------------------------------------+
| CHARINDEX('UZZY', 'FUZZY WUZZY', 1) |
|-------------------------------------|
|                                   2 |
+-------------------------------------+

Même exemple que précédemment, mais en commençant à la position 5, on trouve la deuxième occurrence, plutôt que la première :

SELECT CHARINDEX('uzzy', 'fuzzy wuzzy', 5);

+-------------------------------------+
| CHARINDEX('UZZY', 'FUZZY WUZZY', 5) |
|-------------------------------------|
|                                   8 |
+-------------------------------------+

Recherchez différents caractères, y compris les caractères Unicode, dans des chaînes :

SELECT n, h, CHARINDEX(n, h) FROM pos;

+--------+---------------------+-------------------+
| N      | H                   | CHARINDEX(N IN H) |
|--------+---------------------+-------------------|
|        |                     |                 1 |
|        | sth                 |                 1 |
| 43     | 41424344            |                 5 |
| a      | NULL                |              NULL |
| dog    | catalog             |                 0 |
| log    | catalog             |                 5 |
| lésine | le péché, la lésine |                14 |
| nicht  | Ich weiß nicht      |                10 |
| sth    |                     |                 0 |
| ☃c     | ☃a☃b☃c☃d            |                 5 |
| ☃☃     | bunch of ☃☃☃☃       |                10 |
| ❄c     | ❄a☃c❄c☃             |                 5 |
| NULL   | a                   |              NULL |
| NULL   | NULL                |              NULL |
+--------+---------------------+-------------------+

Recherchez des octets dans une valeur binaire. Notez que, comme les valeurs ci-dessous sont des représentations hexadécimales, un seul octet BINARY est représenté par deux chiffres hexadécimaux.

Dans cet exemple, la valeur renvoyée est 3 car « EF » correspond au troisième octet (le premier octet est « AB » ; le deuxième octet est « CD » et le troisième octet est « EF ».) :

SELECT CHARINDEX(X'EF', X'ABCDEF');

+-------------------------------+
| CHARINDEX(X'EF' IN X'ABCDEF') |
|-------------------------------|
|                             3 |
+-------------------------------+

Dans cet exemple, il n’y a pas de correspondance. Bien que la séquence “BC” semble être dans la valeur recherchée, le “B” est le deuxième nybble du premier octet et le “C” est le premier nybble du deuxième octet ; aucun octet ne contient réellement “BC”, la valeur renvoyée est donc 0 (introuvable).

SELECT CHARINDEX(X'BC', X'ABCD');

+-----------------------------+
| CHARINDEX(X'BC' IN X'ABCD') |
|-----------------------------+
|                           0 |
+-----------------------------+