Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come funziona la funzione PATINDEX() in SQL Server (T-SQL)

In SQL Server puoi utilizzare T-SQL PATINDEX() funzione per trovare un modello all'interno di una stringa. In particolare, la funzione restituisce solo il primo occorrenza del modello all'interno della stringa.

La funzione accetta due argomenti; il modello e la stringa.

Puoi utilizzare caratteri jolly all'interno del modello.

Sintassi

La sintassi è questa:

PATINDEX ( '%pattern%' , expression )

Dove modello è un'espressione di caratteri che contiene la sequenza da trovare e espressione è 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 qualsiasi 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        |
+----------+

Tuttavia, se l'intera stringa corrisponde al modello senza caratteri jolly, otterrai una corrispondenza:

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

Risultato:

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

Tuttavia, non otterrai una corrispondenza se la stringa contiene più caratteri:

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

Risultato:

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

In tal caso potresti usare un singolo carattere jolly:

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

Risultato:

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

Potresti anche usare un singolo carattere jolly da qualche parte nel mezzo del pattern:

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

Risultato:

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

In questo caso abbiamo ottenuto una corrispondenza perché l'inizio e la fine della stringa corrispondevano all'inizio e alla fine del pattern. Ovviamente, il centro della stringa corrispondeva anche al centro del pattern, perché tutti gli altri caratteri sono coperti dal segno di 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 trattino basso (_ ) 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 – Confronto del _ e % Caratteri jolly

Questo esempio mostra la differenza tra _ e % caratteri jolly.

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

Risultato:

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

Il trattino basso corrisponde solo quando c'è esattamente un carattere in quella posizione. Per abbinare due caratteri, dobbiamo usare due caratteri di sottolineatura.

Il segno di percentuale, invece, corrisponde a qualsiasi numero di caratteri, incluso lo zero, come mostrato nell'esempio seguente:

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 Albums
WHERE 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 utilizzo il WHERE clausola per restituire solo gli album che effettivamente corrispondono, insieme al loro PATINDEX() risultato. Se ho lasciato cadere il WHERE clausola, tutti gli album sarebbero stati restituiti, indipendentemente dal fatto che corrispondessero o meno.

Per quelli che non corrispondono, il PATINDEX() il risultato 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 – Solo prima occorrenza

Come accennato, PATINDEX() restituisce solo il primo occorrenza del modello all'interno della stringa.

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

Risultato:

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

Il CHARINDEX() Funzione

Il CHARINDEX() di T-SQL la funzione è simile a PATINDEX() . Tuttavia, ci sono alcune differenze tra i due. In particolare, il PATINDEX() accetta caratteri jolly, ma non una posizione iniziale. CHARINDEX() accetta invece una posizione di partenza, ma non caratteri jolly.