In SQL Server, è possibile utilizzare la funzione T-SQLPATINDEX()
per trovare un modello all’interno di una stringa. In particolare, la funzione restituisce solo la prima occorrenza del modello all’interno della stringa.
La funzione accetta due argomenti; il modello e la stringa.
È possibile utilizzare caratteri jolly all’interno del modello.
Sintassi
La sintassi va così:
PATINDEX ( '%pattern%' , expression )
Dove pattern è un’espressione di carattere che contiene la sequenza da trovare e expression è l’espressione da cercare.
Esempio 1 – Utilizzo di Base
Ecco un esempio di come funziona:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
Risultato:
+----------+| Result ||----------|| 12 |+----------+
Il segno di percentuale (%
) è un carattere jolly che rappresenta una stringa di zero o più caratteri.
Esempio 2-Nessuna corrispondenza
Ecco cosa succede quando non includiamo i caratteri jolly:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
Risultato:
+----------+| Result ||----------|| 0 |+----------+
anche se, se la stringa corrisponde al modello senza caratteri jolly, avrete un risultato:
SELECT PATINDEX('Bob', 'Bob') AS Result;
Risultato:
+----------+| Result ||----------|| 1 |+----------+
Tuttavia, non si ottiene una partita se la stringa contiene più caratteri:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
Risultato:
+----------+| Result ||----------|| 0 |+----------+
In quale caso è possibile utilizzare un singolo carattere jolly:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
Risultato:
+----------+| Result ||----------|| 1 |+----------+
È anche possibile utilizzare un singolo carattere jolly da qualche parte nel mezzo del modello:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
Risultato:
+----------+| Result ||----------|| 1 |+----------+
In questo caso abbiamo avuto un match perché l’inizio e la fine della stringa abbinato l’inizio e la fine del modello. Naturalmente, il centro della stringa corrisponde anche al centro del modello, perché tutti gli altri caratteri sono coperti dal segno percentuale.
Esempio 3 – Il carattere jolly di sottolineatura
Ecco un altro esempio in cui introduciamo un altro carattere jolly:
SELECT PATINDEX('B_er', 'Beer') AS Result;
Risultato:
+----------+| Result ||----------|| 1 |+----------+
Il carattere di sottolineatura (_
) che è un carattere jolly per ogni singolo carattere. Pertanto, corrisponderà solo se c’è esattamente un carattere in quella posizione.
Naturalmente, il modello sopra potrebbe corrispondere a molte stringhe diverse. Ad esempio:
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';
Risultato:
+--------+--------+--------+--------+| Beer | Bier | Baer | B er ||--------+--------+--------+--------|| 1 | 1 | 1 | 1 |+--------+--------+--------+--------+
Esempio 4 – Confrontando i caratteri jolly _ e %
Questo esempio dimostra la differenza tra i caratteri jolly _
e %
.
SELECT PATINDEX('B%r', 'Beer') AS '%', PATINDEX('B_r', 'Beer') AS '_', PATINDEX('B__r', 'Beer') AS '__';
Risultato:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 1 |+-----+-----+------+
Il carattere di sottolineatura corrisponde solo quando c’è esattamente un carattere in quella posizione. Per abbinare due caratteri, dobbiamo usare due caratteri di sottolineatura.
Il segno percentuale d’altra parte, corrisponde a qualsiasi numero di caratteri, incluso zero, come visto nel seguente esempio:
SELECT PATINDEX('Bee%r', 'Beer') AS '%', PATINDEX('Bee_r', 'Beer') AS '_', PATINDEX('Bee__r', 'Beer') AS '__';
Risultato:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 0 |+-----+-----+------+
Esempio 5 – Un Esempio di Database
Ecco un esempio di utilizzo di questa funzione in una query di database:
USE Music;SELECT AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM AlbumsWHERE PATINDEX('%the%', AlbumName) > 0;
Risultato:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || No Prayer for the Dying | 15 || The Sixteen Men of Tain | 1 |+-------------------------+-----------------+
In questo caso uso il WHERE
clausola per la restituzione solo di quegli album che in realtà corrispondono, insieme con il loro PATINDEX()
risultato. Se ho lasciato cadere la clausolaWHERE
, tutti gli album sarebbero stati restituiti, indipendentemente dal fatto che corrispondessero o meno.
Per quelli che non corrispondevano, il risultato PATINDEX()
sarebbe zero.
USE Music;SELECT TOP(10) AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM Albums;
Risultato:
+-------------------------+-----------------+| 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 |+-------------------------+-----------------+
Esempio 6 – Prima Occorrenza Solo
Come detto, PATINDEX()
restituisce solo la prima occorrenza del pattern all’interno della stringa.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
Risultato:
+----------+| Result ||----------|| 5 |+----------+
La funzione CHARINDEX ()
La funzione T-SQL CHARINDEX()
è simile a PATINDEX()
. Tuttavia, ci sono alcune differenze tra i due. In particolare,PATINDEX()
accetta caratteri jolly, ma non una posizione iniziale. CHARINDEX()
d’altra parte accetta una posizione iniziale, ma non caratteri jolly.