In SQL Server, puoi utilizzare il CHARINDEX()
funzione o il PATINDEX()
funzione per trovare una stringa all'interno di una stringa. Si tratta di funzioni di stringa Transact-SQL e sono disponibili anche nei database di Azure.
In apparenza, queste funzioni sembrano fare esattamente la stessa cosa e, in molti casi, potresti usare quella che preferisci.
Tuttavia, ci sono un paio di distinzioni che potrebbero dettare quale funzione si decide di utilizzare in determinati scenari. Questi possono essere riassunti come segue:
PATINDEX()
consente di utilizzare caratteri jolly per cercare modelli.CHARINDEX()
no.CHARINDEX()
accetta un terzo argomento che ti consente di specificare la posizione iniziale della ricerca.PATINDEX()
no.
Maggiori dettagli su questi punti di seguito.
Definizione
Per prima cosa, diamo un'occhiata alla definizione ufficiale o a ciascuna funzione.
CHARINDEX()
- Cerca un'espressione di carattere all'interno di una seconda espressione di carattere, restituendo la posizione iniziale della prima espressione, se trovata.
PATINDEX()
- Restituisce la posizione iniziale della prima occorrenza di un modello in un'espressione specificata, o zeri se il modello non viene trovato, su tutti i tipi di dati di testo e carattere validi.
Sintassi
Ed ecco la sintassi ufficiale di ogni funzione.
CHARINDEX()
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
PATINDICE()
PATINDEX ( '%pattern%' , expression )
Quindi entrambe le funzioni ti consentono di cercare un'espressione di carattere, tuttavia il PATINDEX()
la funzione consente di cercare un modello . Quindi questa è una funzionalità extra che non ottieni con CHARINDEX()
funzione. Con PATINDEX()
puoi usare i caratteri jolly per specificare un modello da cercare, il che potrebbe essere molto utile in alcune situazioni.
Tuttavia, CHARINDEX()
accetta tre argomenti mentre PATINDEX()
ne accetta solo due. Il CHARINDEX()
La funzione accetta un terzo argomento opzionale che consente di specificare la posizione iniziale della ricerca. In altre parole, il CHARINDEX()
La funzione ti consente di restituire solo quelle corrispondenze che si verificano dopo un certo punto nella stringa.
Esempi
Ecco degli esempi che dimostrano le funzionalità extra fornite da ciascuna funzione.
CHARINDEX()
Qui, fornisco un terzo argomento per specificare una posizione per iniziare la ricerca. In questo caso, salterà la prima occorrenza di Bob
e restituirà la posizione della seconda occorrenza.
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Risultato:
17
Quindi, come accennato, non puoi farlo con PATINDEX()
perché non accetta quel terzo parametro.
PATINDICE()
Ora ecco un esempio di qualcosa che puoi fare con PATINDEX()
che non puoi fare con CHARINDEX()
. In questo esempio, utilizziamo i caratteri jolly per cercare un modello:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Risultato:
11
In questo caso, utilizziamo i segni di percentuale (%
) che sono caratteri jolly per indicare che un numero qualsiasi di caratteri potrebbe procedere e seguire la nostra stringa di ricerca. Usiamo anche il trattino basso (_
) che è un carattere jolly per qualsiasi singolo carattere.
Conclusione
Quindi, mentre entrambi CHARINDEX()
e PATINDEX()
forniscono funzionalità simili e, in molti casi, è possibile utilizzarne uno al posto dell'altro, a volte è necessario utilizzarne uno sull'altro.
In particolare, useresti CHARINDEX()
quando si desidera specificare una posizione iniziale all'interno della stringa da cercare. E useresti PATINDEX()
ogni volta che devi specificare un pattern da cercare.