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

Come trovare una stringa all'interno di una stringa in SQL Server

In SQL Server puoi utilizzare T-SQL CHARINDEX() funzione o il PATINDEX() funzione per trovare una stringa all'interno di un'altra stringa. Ecco una rapida panoramica di ciascuna funzione.

La funzione CHARINDEX()

Questa funzione accetta 3 argomenti; la stringa da trovare, la stringa da cercare e una posizione iniziale facoltativa.

Il CHARINDEX() la sintassi va così:

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

Dove expressionToFind è l'espressione che vuoi trovare nell'altra stringa e expressionToSearch è l'altra stringa. La posizione_di_inizio facoltativa può essere utilizzato per specificare una posizione all'interno di expressionToSearch per cui iniziare la ricerca.

Nota che viene restituita solo la posizione della prima occorrenza.

Esempio

Ecco un esempio:

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');

Risultato:

1

In questo esempio, il primo argomento è Bob , il che significa che stiamo cercando il secondo argomento per Bob . Il risultato è 1 perché quella è la posizione in cui Bob appare prima nel secondo argomento.

Potresti anche notare che Bob in realtà appare due volte nella stringa, ma viene restituita solo la posizione della prima corrispondenza.

Nessuna corrispondenza

Se il secondo argomento non contiene Bob il risultato sarebbe stato 0 .

SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');

Risultato:

0

Specifica di una posizione di partenza

È possibile specificare una posizione iniziale da cui iniziare la ricerca. Ciò significa che SQL Server salterà qualsiasi occorrenza che precede quella posizione iniziale. Tuttavia, i risultati vengono comunque riportati in base alla sua posizione all'interno della stringa (non dalla posizione iniziale).

Se questo sembra confuso, il seguente esempio dovrebbe aiutare:

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Risultato:

17

Quindi in questo esempio iniziamo a cercare dalla posizione 16 (che sembra essere lo spazio prima del 2° Bob ). Il risultato è che la prima occorrenza di Bob viene saltato e viene restituita la posizione del secondo. E possiamo vedere che la sua posizione è a 17 caratteri dall'inizio della stringa (anche se è solo un carattere da dove abbiamo iniziato la ricerca).

Maiuscole/minuscole

Puoi eseguire esplicitamente una ricerca con distinzione tra maiuscole e minuscole aggiungendo la clausola COLLATE alla tua istruzione SELECT:

Maiuscole/minuscole

Ecco una ricerca con distinzione tra maiuscole e minuscole:

SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);

Risultato:

0

Questo fa distinzione tra maiuscole e minuscole perché _CS sta per Case-Sensitive.

Maiuscole/minuscole

Ed ecco una ricerca senza distinzione tra maiuscole e minuscole:

SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);

Risultato:

11

Non fa distinzione tra maiuscole e minuscole perché _CI sta per Case-Insensitive.

La funzione PATINDEX()

Il PATINDEX() la funzione svolge un lavoro simile a CHARINDEX() . Fondamentalmente puoi scegliere quale usare. La differenza principale è nella sintassi.

Il PATINDEX() la sintassi della funzione è questa:

PATINDEX ( '%pattern%' , expression )

Dove modello è un'espressione di caratteri che contiene la sequenza da trovare e espressione è l'espressione da cercare (tipicamente una colonna).

Il PATINDEX() accetta caratteri jolly, ma non una posizione iniziale. CHARINDEX() accetta invece una posizione di partenza, ma non caratteri jolly.

Esempi

Ecco un esempio:

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

Risultato:

12

Tuttavia, ecco cosa succede quando non includiamo i caratteri jolly:

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

Risultato:

0

Ecco un altro esempio in cui introduciamo un altro carattere jolly:

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

Risultato:

11

In questo caso, il trattino basso (_ ) che è un carattere jolly per ogni singolo carattere.