Catégories :

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

POSITION

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

CHARINDEX

Notez que la fonction CHARINDEX ne prend pas en charge l’une des variations syntaxiques que la fonction POSITION prend en charge.

Syntaxe

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

POSITION( <expr1> IN <expr2> )
Copy

Arguments

Obligatoire :

expr1

Une chaîne de caractères ou une expression binaire représentant la valeur à rechercher.

expr2

Une chaîne de caractères ou une expression binaire représentant la valeur à rechercher.

Facultatif :

start_pos

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, la fonction renvoie NULL.

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

  • Si start_pos facultatif spécifié se situe au-delà de la fin du deuxième argument (la chaîne que nous recherchons), la fonction renvoie 0.

  • Si le premier argument est vide (par exemple, une chaîne vide), la fonction 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

Expression VARCHAR

Trouver la première occurrence de « an » dans « banane » :

select position('an', 'banana', 1);
+-----------------------------+
| POSITION('AN', 'BANANA', 1) |
|-----------------------------|
|                           2 |
+-----------------------------+
Copy

Trouver la première occurrence de « an » dans « banane » à la position 3 ou après. Cette recherche trouve la deuxième occurrence de « an ».

select position('an', 'banana', 3);
+-----------------------------+
| POSITION('AN', 'BANANA', 3) |
|-----------------------------|
|                           4 |
+-----------------------------+
Copy

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

SELECT n, h, POSITION(n in h) FROM pos;

+--------+---------------------+------------------+
| N      | H                   | POSITION(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 |
+--------+---------------------+------------------+
Copy

Expression BINARY

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 position(X'EF', X'ABCDEF');
+----------------------------+
| POSITION(X'EF', X'ABCDEF') |
|----------------------------|
|                          3 |
+----------------------------+
Copy

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 position(X'BC', X'ABCD');
+--------------------------+
| POSITION(X'BC', X'ABCD') |
|--------------------------|
|                        0 |
+--------------------------+
Copy