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

Fonctionnement de la fonction PATINDEX() dans SQL Server (T-SQL)

Dans SQL Server, vous pouvez utiliser T-SQL PATINDEX() fonction pour trouver un motif dans une chaîne. Plus précisément, la fonction ne renvoie que le premier occurrence du motif dans la chaîne.

La fonction accepte deux arguments ; le motif et la ficelle.

Vous pouvez utiliser des caractères génériques dans le modèle.

Syntaxe

La syntaxe ressemble à ceci :

PATINDEX ( '%pattern%' , expression )

motif est une expression de caractère qui contient la séquence à rechercher, et expression est l'expression à rechercher.

Exemple 1 - Utilisation de base

Voici un exemple de son fonctionnement :

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

Résultat :

+----------+
| Result   |
|----------|
| 12       |
+----------+

Le signe de pourcentage (% ) est un caractère générique qui représente n'importe quelle chaîne de zéro ou plusieurs caractères.

Exemple 2 – Aucune correspondance

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

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

Résultat :

+----------+
| Result   |
|----------|
| 0        |
+----------+

Cependant, si la chaîne complète correspond au modèle sans aucun caractère générique, vous obtiendrez une correspondance :

SELECT PATINDEX('Bob', 'Bob') AS Result;

Résultat :

+----------+
| Result   |
|----------|
| 1        |
+----------+

Cependant, vous n'obtiendrez pas de correspondance si la chaîne contient plus de caractères :

SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;

Résultat :

+----------+
| Result   |
|----------|
| 0        |
+----------+

Dans ce cas, vous pouvez utiliser un seul caractère générique :

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

Résultat :

+----------+
| Result   |
|----------|
| 1        |
+----------+

Vous pouvez également utiliser un seul caractère générique quelque part au milieu du modèle :

SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;

Résultat :

+----------+
| Result   |
|----------|
| 1        |
+----------+

Dans ce cas, nous avons obtenu une correspondance car le début et la fin de la chaîne correspondaient au début et à la fin du motif. Bien entendu, le milieu de la chaîne correspondait également au milieu du motif, car tous les autres caractères sont couverts par le signe de pourcentage.

Exemple 3 - Le caractère générique de soulignement

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

SELECT PATINDEX('B_er', 'Beer') AS Result;

Résultat :

+----------+
| Result   |
|----------|
| 1        |
+----------+

Le trait de soulignement (_ ) qui est un joker pour n'importe quel caractère unique. Par conséquent, il ne correspondra que s'il y a exactement un caractère à cette position.

Bien sûr, le modèle ci-dessus peut correspondre à de nombreuses chaînes différentes. Par exemple :

SELECT 
  PATINDEX('B_er', 'Beer') AS 'Beer',
  PATINDEX('B_er', 'Bier') AS 'Bier',
  PATINDEX('B_er', 'Baer') AS 'Baer',
  PATINDEX('B_er', 'B er') AS 'B er';

Résultat :

+--------+--------+--------+--------+
| Beer   | Bier   | Baer   | B er   |
|--------+--------+--------+--------|
| 1      | 1      | 1      | 1      |
+--------+--------+--------+--------+

Exemple 4 – Comparer le _ et % Caractères génériques

Cet exemple montre la différence entre le _ et % caractères génériques.

SELECT 
  PATINDEX('B%r', 'Beer') AS '%',
  PATINDEX('B_r', 'Beer') AS '_',
  PATINDEX('B__r', 'Beer') AS '__';

Résultat :

+-----+-----+------+
| %   | _   | __   |
|-----+-----+------|
| 1   | 0   | 1    |
+-----+-----+------+

Le trait de soulignement ne correspond que lorsqu'il y a exactement un caractère à cette position. Pour faire correspondre deux caractères, nous devons utiliser deux traits de soulignement.

Le signe de pourcentage, quant à lui, correspond à n'importe quel nombre de caractères, y compris zéro, comme dans l'exemple suivant :

SELECT 
  PATINDEX('Bee%r', 'Beer') AS '%',
  PATINDEX('Bee_r', 'Beer') AS '_',
  PATINDEX('Bee__r', 'Beer') AS '__';

Résultat :

+-----+-----+------+
| %   | _   | __   |
|-----+-----+------|
| 1   | 0   | 0    |
+-----+-----+------+

Exemple 5 - Un exemple de base de données

Voici un exemple d'utilisation de cette fonction dans une requête de base de données :

USE Music;
SELECT 
  AlbumName,
  PATINDEX('%the%', AlbumName) AS 'Pattern Index'
FROM Albums
WHERE PATINDEX('%the%', AlbumName) > 0;

Résultat :

+-------------------------+-----------------+
| AlbumName               | Pattern Index   |
|-------------------------+-----------------|
| Singing Down the Lane   | 14              |
| Ziltoid the Omniscient  | 9               |
| No Prayer for the Dying | 15              |
| The Sixteen Men of Tain | 1               |
+-------------------------+-----------------+

Dans ce cas, j'utilise le WHERE clause pour renvoyer uniquement les albums qui correspondent réellement, ainsi que leur PATINDEX() résultat. Si j'ai laissé tomber le WHERE clause, tous les albums auraient été retournés, qu'ils correspondent ou non.

Pour ceux qui ne correspondent pas, le PATINDEX() le résultat serait zéro.

USE Music;
SELECT TOP(10)
  AlbumName,
  PATINDEX('%the%', AlbumName) AS 'Pattern Index'
FROM Albums;

Résultat :

+-------------------------+-----------------+
| AlbumName               | Pattern Index   |
|-------------------------+-----------------|
| Powerslave              | 0               |
| Powerage                | 0               |
| Singing Down the Lane   | 14              |
| Ziltoid the Omniscient  | 9               |
| Casualties of Cool      | 0               |
| Epicloud                | 0               |
| Somewhere in Time       | 0               |
| Piece of Mind           | 0               |
| Killers                 | 0               |
| No Prayer for the Dying | 15              |
+-------------------------+-----------------+

Exemple 6 - Première occurrence uniquement

Comme mentionné, PATINDEX() renvoie uniquement le premier occurrence du motif dans la chaîne.

SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;

Résultat :

+----------+
| Result   |
|----------|
| 5        |
+----------+

Le CHARINDEX() Fonction

Le T-SQL CHARINDEX() la fonction est similaire à PATINDEX() . Cependant, il existe quelques différences entre les deux. En particulier, 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.