CHARINDEX in SQL Server: cos’è e come funziona (con esempi)

Quando si parla di “CHARINDEX SQL Server”, si fa riferimento a una funzione fondamentale per la manipolazione e l’analisi delle stringhe. È il tuo coltellino svizzero quando devi trovare la posizione di una sottostringa all’interno di una stringa più grande.

Cos’è CHARINDEX in SQL Server?

La funzione CHARINDEX in SQL Server cerca la posizione di inizio di una sottostringa (o “espressione di ricerca”) all’interno di una stringa specificata. Se la sottostringa viene trovata, CHARINDEX restituisce la posizione intera del suo primo carattere. Se la sottostringa non viene trovata, restituisce 0.

Sintassi di Base

La sintassi più comune di CHARINDEX è:

SQL

CHARINDEX ( substring , string [, start_location ] )

Dove:

  • substring: La stringa (o espressione) che stai cercando.
  • string: La stringa (o espressione) in cui vuoi cercare la substring.
  • start_location (opzionale): Un numero intero che specifica la posizione da cui iniziare la ricerca all’interno della string. Se omesso, la ricerca inizia dall’inizio della string (posizione 1).

Importante: La funzione CHARINDEX restituisce la posizione del carattere in base 1. Quindi, la prima posizione è 1, la seconda è 2, e così via.


Esempi Pratici di CHARINDEX

Vediamo alcuni esempi per capire meglio come funziona e quando usarla.

Esempio 1: Trovare la Posizione di una Sottostringa Semplice

Immagina di avere una stringa e di voler trovare la posizione di una parola specifica.

SQL

SELECT CHARINDEX('SQL', 'Impara SQL Server con facilità') AS PosizioneSQL;
-- Risultato: 8 (perché 'S' di 'SQL' è l'ottavo carattere)

SELECT CHARINDEX('server', 'Impara SQL Server con facilità') AS PosizioneServer;
-- Risultato: 0 (perché 'server' è in minuscolo e la ricerca è case-sensitive in molte configurazioni di SQL Server!)

SELECT CHARINDEX('Impara', 'Impara SQL Server con facilità', 5) AS PosizioneImparaDopo5;
-- Risultato: 0 (perché 'Impara' inizia prima della posizione 5 e non si ripete dopo)

Nota sulla Case-Sensitivity: La sensibilità alle maiuscole/minuscole di CHARINDEX dipende dalla collation della tua colonna o del tuo database. Se la tua collation è case-sensitive (es. Latin1_General_CS_AS), CHARINDEX('sql', 'SQL') restituirà 0. Se è case-insensitive (es. Latin1_General_CI_AS), restituirà la posizione corretta. Per rendere la ricerca esplicitamente case-insensitive, puoi convertire entrambe le stringhe in maiuscolo o minuscolo prima della ricerca, oppure usare COLLATE.

SQL

-- Per una ricerca case-insensitive forzata
SELECT CHARINDEX('server', 'Impara SQL Server con facilità' COLLATE Latin1_General_CI_AS) AS PosizioneServerCI;
-- Risultato: 10 (se la tua collation di default è case-sensitive, altrimenti 0)

-- O più semplicemente, per garantirla
SELECT CHARINDEX(LOWER('server'), LOWER('Impara SQL Server con facilità')) AS PosizioneServerLower;
-- Risultato: 10

Esempio 2: Usare CHARINDEX per Estrapolare Parti di Stringa

Spesso, CHARINDEX viene combinata con altre funzioni di manipolazione stringhe come SUBSTRING per estrarre porzioni di testo.

Scenario: Hai un elenco di nomi in formato “Cognome, Nome” e vuoi separare il cognome dal nome.

SQL

-- Dati di esempio
CREATE TABLE Utenti (
    ID INT PRIMARY KEY,
    NomeCompleto VARCHAR(100)
);

INSERT INTO Utenti (ID, NomeCompleto) VALUES
(1, 'Rossi, Mario'),
(2, 'Verdi, Anna'),
(3, 'Bianchi, Luigi');

-- Query per separare Cognome e Nome
SELECT
    NomeCompleto,
    SUBSTRING(NomeCompleto, 1, CHARINDEX(',', NomeCompleto) - 1) AS Cognome,
    SUBSTRING(NomeCompleto, CHARINDEX(',', NomeCompleto) + 2, LEN(NomeCompleto)) AS Nome
FROM
    Utenti;

-- Risultato:
-- NomeCompleto     Cognome   Nome
-- -------------    --------  ------
-- Rossi, Mario     Rossi     Mario
-- Verdi, Anna      Verdi     Anna
-- Bianchi, Luigi   Bianchi   Luigi

DROP TABLE Utenti;

Qui, CHARINDEX(',', NomeCompleto) trova la posizione della virgola. Sottraendo 1 otteniamo la fine del cognome, aggiungendo 2 (virgola + spazio) otteniamo l’inizio del nome.

Esempio 3: Controllare la Presenza di un Carattere Specifico

Puoi usare CHARINDEX in una clausola WHERE per filtrare righe basate sulla presenza o assenza di un carattere o una sottostringa.

SQL

-- Usiamo di nuovo la tabella Utenti
CREATE TABLE Utenti (
    ID INT PRIMARY KEY,
    NomeCompleto VARCHAR(100),
    Email VARCHAR(100)
);

INSERT INTO Utenti (ID, NomeCompleto, Email) VALUES
(1, 'Rossi, Mario', 'mario.rossi@email.com'),
(2, 'Verdi, Anna', 'anna.verdi@web.it'),
(3, 'Bianchi, Luigi', 'luigi@mail.com'),
(4, 'Neri, Sara', 'saracorp.com'); -- Email non valida (manca '@')

-- Trova utenti con un'email valida (che contenga '@')
SELECT NomeCompleto, Email
FROM Utenti
WHERE CHARINDEX('@', Email) > 0;

-- Risultato:
-- NomeCompleto     Email
-- -------------    ---------------------
-- Rossi, Mario     mario.rossi@email.com
-- Verdi, Anna      anna.verdi@web.it
-- Bianchi, Luigi   luigi@mail.com

DROP TABLE Utenti;

La condizione CHARINDEX('@', Email) > 0 è vera solo se il carattere @ è trovato nella stringa Email a una posizione maggiore di zero (cioè, è presente).


CHARINDEX vs. PATINDEX

Un’altra funzione simile ma più potente per la ricerca di pattern è PATINDEX.

  • CHARINDEX: Cerca una sottostringa esatta. Non supporta wildcard (caratteri jolly) all’interno della substring da cercare.
  • PATINDEX: Cerca un pattern e supporta wildcard Transact-SQL (come %, _, [], [^]). È più flessibile per ricerche complesse basate su modelli.
SQL

SELECT CHARINDEX('S_L', 'Impara SQL Server'); -- Risultato: 0 (non trova 'S_L' come sottostringa esatta)
SELECT PATINDEX('%S_L%', 'Impara SQL Server'); -- Risultato: 8 (trova 'SQL' che corrisponde al pattern 'S_L')

Quando Usare CHARINDEX?

Usa CHARINDEX quando:

  • Devi trovare la posizione di una sottostringa specifica e fissa.
  • Devi determinare se una stringa contiene una sottostringa.
  • Vuoi estrarre parti di una stringa usando un delimitatore noto.
  • Hai bisogno di convalidare il formato di una stringa (es. presenza di @ in un’email).

È una delle funzioni stringa più utilizzate e, combinata con SUBSTRING, LEFT, RIGHT e LEN, ti dà un controllo eccezionale sulla manipolazione del testo nelle tue query SQL.