Dans SQL Server, vous pouvez utiliser la fonction T-SQL PATINDEX()
pour trouver un motif dans une chaîne. Plus précisément, la fonction ne renvoie que la première occurrence du motif dans la chaîne.
La fonction accepte deux arguments ; le motif et la chaîne.
Vous pouvez utiliser des caractères génériques dans le motif.
Syntaxe
La syntaxe est la suivante:
PATINDEX ( '%pattern%' , expression )
Où pattern est une expression de caractère qui contient la séquence à trouver, et expression est l’expression à rechercher.
Exemple 1 – Utilisation de base
Voici un exemple de 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 quel signe chaîne de zéro caractère ou plus.
Exemple 2 – Pas de 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 |+----------+
Bien que, si la chaîne complète correspond au motif sans caractères génériques, 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 motif:
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 fin du motif. Bien sûr, le milieu de la chaîne correspond é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 caractère générique pour n’importe quel caractère. Par conséquent, il ne correspondra que s’il y a exactement un caractère dans cette position.
Bien sûr, le modèle ci-dessus pourrait 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 – Comparaison des caractères génériques _ et %
Cet exemple montre la différence entre les caractères génériques _
et %
.
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.
D’autre part, le signe de pourcentage correspond à un nombre quelconque de caractères, y compris zéro, comme on le voit 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 AlbumsWHERE 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 la clause WHERE
pour renvoyer uniquement les albums qui correspondent réellement, ainsi que leur résultat PATINDEX()
. Si j’avais supprimé la clause WHERE
, tous les albums auraient été renvoyés, qu’ils correspondent ou non.
Pour ceux qui ne correspondaient pas, le résultat PATINDEX()
serait nul.
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 la première occurrence du motif dans la chaîne.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
Résultat:
+----------+| Result ||----------|| 5 |+----------+
La fonction CHARINDEX()
La fonction T-SQL CHARINDEX()
est similaire à PATINDEX()
div>. Cependant, il existe certaines différences entre les deux. En particulier, 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 des caractères génériques.