Menu

Funzioni stringa in SQLite: SUBSTR, REPLACE, INSTR e altre

Le funzioni stringa di SQLite nella pratica: concatenazione con ||, SUBSTR, INSTR, REPLACE, TRIM e gli schemi per pulire e trasformare il testo nelle query.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Le stringhe sono il cuore delle query reali

I numeri sono facili. Con le stringhe le query si complicano: nomi con spazi di troppo, email con maiuscole e minuscole mescolate, ID incollati con trattini, campi di testo libero che corrispondono quasi, ma non del tutto. SQLite offre un insieme piccolo e mirato di funzioni stringa che gestisce quasi tutto questo senza bisogno di codice applicativo.

Questa pagina passa in rassegna quelle che userai per prime: concatenare, estrarre porzioni, cercare, sostituire, ripulire e formattare.

Per concatenare si usa ||, non CONCAT

SQLite non ha una funzione CONCAT. Le stringhe si uniscono con l'operatore ||:

I numeri e gli altri tipi vengono convertiti in testo automaticamente. Il tranello: se uno qualsiasi degli operandi è NULL, l'intera espressione diventa NULL. È il comportamento standard di SQL, ma coglie di sorpresa parecchie persone:

Avvolgi le colonne che possono essere nulle in COALESCE(col, '') o COALESCE(col, 'default') quando non vuoi che un valore mancante cancelli l'intera stringa.

Length, Upper, Lower

Le tre che userai continuamente:

Per il testo LENGTH restituisce il numero di caratteri, non di byte. Se ti servono davvero i byte (raro, ma utile per analizzare lo spazio occupato), usa OCTET_LENGTH. Per impostazione predefinita UPPER e LOWER trasformano solo le lettere ASCII: i caratteri accentati restano invariati, a meno che tu non abbia caricato l'estensione ICU.

SUBSTR: estrarre porzioni di stringa

SUBSTR(text, start, length) estrae un pezzo di una stringa. Gli indici partono da 1: 1 è il primo carattere, non 0:

Alcune cose da ricordare:

  • Il terzo argomento è facoltativo. Senza, ottieni tutto da start fino alla fine.
  • Uno start negativo conta dalla fine della stringa.
  • Se start va oltre la fine, ottieni una stringa vuota, non un errore.

SUBSTRING è accettato come sinonimo, nel caso le tue abitudini vengano da un altro database.

INSTR: trovare una sottostringa

INSTR(haystack, needle) restituisce la posizione (a partire da 1) della prima occorrenza di needle in haystack, oppure 0 se non la trova:

L'ultima espressione è l'idioma SQLite per "tutto quello che viene prima della @": trovi il delimitatore con INSTR, poi tagli con SUBSTR. Scriverai spesso questa combinazione. Nota che, siccome INSTR restituisce 0 quando non trova nulla, conviene controllare prima di tagliare: passare 0 a SUBSTR dà in silenzio risultati strani.

REPLACE: sostituire una sottostringa con un'altra

REPLACE(text, old, new) sostituisce ogni occorrenza di old con new:

Distingue maiuscole e minuscole e non accetta espressioni regolari: solo una sottostringa letterale. Per trasformazioni più complesse puoi concatenare più chiamate a REPLACE, ma oltre due o tre annidate è ora di fare il lavoro nell'applicazione.

TRIM, LTRIM, RTRIM

I dati inseriti dagli utenti tendono ad arrivare con spazi alle estremità. TRIM li elimina:

Per impostazione predefinita rimuovono gli spazi. Passa un secondo argomento per indicare quali caratteri togliere: ogni carattere del secondo argomento viene trattato come membro di un "insieme da rimuovere", non come sottostringa letterale. Quindi TRIM('xxxhelloxx', 'x') dà 'hello'.

printf: formattare numeri e stringhe

Quando ti serve una stringa formattata (decimali fissi, numeri con riempimento, output esadecimale), ci pensa printf (che si scrive anche format):

Gli specificatori di formato seguono le convenzioni del C: %d, %s, %f, %x, riempimento con 0 o spazi e così via. È molto più pulito che costruire stringhe con || e una pila di CAST.

LIKE vs GLOB: confronto con pattern

Due operatori, due mondi diversi.

LIKE usa i classici caratteri jolly di SQL (% per qualsiasi sequenza di caratteri, _ per un singolo carattere) e non distingue maiuscole e minuscole per l'ASCII:

GLOB usa i caratteri jolly della shell Unix (* per qualsiasi sequenza, ? per un singolo carattere, [abc] per le classi di caratteri) e distingue maiuscole e minuscole:

La regola per scegliere: LIKE per i confronti "inizia con", "contiene", "finisce con" pensati per le persone. GLOB quando conta la distinzione tra maiuscole e minuscole o ti servono le classi di caratteri. Entrambi possono usare gli indici, ma solo quando il pattern è ancorato all'inizio ('foo%', non '%foo'): i caratteri jolly iniziali obbligano a una scansione completa.

Dividere le stringhe: non esiste SPLIT

SQLite non include una funzione SPLIT_STRING. I due rimedi pratici:

Per dividere su un delimitatore ottenendo più righe, la strada più pulita è json_each su un array JSON, oppure una CTE ricorsiva. Li vedremo entrambi nei capitoli successivi: per ora ti basta sapere che "dammi ogni parola" in SQLite non si fa in una riga.

Un esempio completo: ripulire i nomi

Mettiamo tutto insieme. Immagina una tabella users con nomi visualizzati disordinati: spazi in più, maiuscole e minuscole mescolate, titoli facoltativi come "Dr. " o "Mr. " da togliere:

L'espressione si legge dall'interno verso l'esterno: togli gli spazi esterni, converti in minuscolo, elimina i titoli, poi rifai il trim nel caso la rimozione del titolo abbia lasciato uno spazio iniziale. Ogni passaggio è una singola funzione: la complessità nasce dall'impilarle. Quando la pila supera i tre o quattro livelli, è un segnale per usare una colonna generata (capitolo: Funzionalità avanzate) oppure fare la pulizia durante l'importazione dei dati.

Cosa portarti a casa

  • || per concatenare; NULL contamina il risultato, quindi usa COALESCE.
  • SUBSTR e INSTR insieme coprono quasi tutti i casi di "trova e taglia".
  • REPLACE sostituisce ogni occorrenza di una sottostringa letterale.
  • TRIM e le sue varianti accettano un insieme di caratteri personalizzato, non solo gli spazi.
  • printf è lo strumento giusto per l'output formattato.
  • LIKE per i caratteri jolly SQL senza distinzione tra maiuscole e minuscole, GLOB per i pattern in stile shell che la fanno.

Prossimo passo: funzioni numeriche

Sistemate le stringhe, la tappa successiva ovvia sono i numeri: arrotondamenti, valori assoluti, stranezze della divisione e le funzioni matematiche aggiunte da SQLite nelle versioni recenti. È la prossima pagina.

Domande frequenti

Come si concatenano le stringhe in SQLite?

Con l'operatore ||, non con CONCAT. SQLite di base non ha una funzione CONCAT: 'Ciao, ' || name unisce due stringhe in una. Se uno qualsiasi degli operandi è NULL, tutto il risultato diventa NULL, quindi avvolgi le colonne che possono essere nulle in COALESCE quando non è quello che vuoi.

Come si estrae una sottostringa in SQLite?

Usa SUBSTR(text, start, length), che si può scrivere anche SUBSTRING. Gli indici partono da 1: SUBSTR('hello', 1, 3) restituisce 'hel'. Un inizio negativo conta dalla fine, e l'argomento della lunghezza è facoltativo: se lo ometti prendi tutto fino alla fine.

SQLite ha una funzione SPLIT_STRING?

No, SQLite non ha una funzione integrata per dividere le stringhe. Nella maggior parte dei casi puoi combinare INSTR e SUBSTR per estrarre la parte che ti serve, oppure usare una CTE ricorsiva per dividere su un delimitatore. Se ti serve spesso, la funzione json_each su un array JSON di solito è più pulita di uno splitter scritto a mano.

Che differenza c'è tra LIKE e GLOB in SQLite?

LIKE per impostazione predefinita non distingue maiuscole e minuscole per l'ASCII e usa % e _ come caratteri jolly. GLOB distingue maiuscole e minuscole e usa i caratteri jolly della shell Unix (*, ?, [abc]). Scegli GLOB quando ti servono la distinzione tra maiuscole e minuscole o le classi di caratteri, e LIKE per il confronto più familiare in stile SQL.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA