Torna all'elenco degli articoli Articoli
Tempo di lettura: 8 minuti

La funzione SQL Substring in 5 esempi

Lavorate con dati di testo in SQL? Vi spieghiamo come ottenere valori da qualsiasi punto di una stringa.

Quando si pensa di lavorare con i dati in SQL, il primo pensiero è probabilmente quello di un database pieno di numeri e del codice SQL che esegue calcoli molto sofisticati. Ma anche il testo è un dato! È molto comune trovare dati di testo nei database. Non solo bisogna estrarli, ma spesso bisogna anche manipolarli. Le funzioni che permettono di farlo si chiamano funzioni di testo.

Per tutti coloro che vogliono esercitarsi con le funzioni SQL, consiglio il nostro corso interattivo. Standard SQL Functions interattivo. Contiene 211 esercizi e insegna come utilizzare le più comuni funzioni di testo, numeriche e di data e ora in SQL.

Una delle funzioni di testo più comuni trattate nel corso è SUBSTRING(). In questo articolo sono riportati cinque esempi di lavoro reali che coprono gli usi principali di questa funzione. Alcuni esempi potrebbero risultare complicati se non si ha familiarità con le funzioni di testo, quindi è bene tenere a portata di mano il foglio informativo Standard SQL Functions o una panoramica delle funzioni di testo SQL.

Che cos'è la funzione SUBSTRING()?

SUBSTRING() è una funzione di testo che consente di estrarre caratteri da una stringa. La sua sintassi è

SUBSTRING(expression, start, length)

Per l'argomento expression si scrive un letterale di stringa o si specifica una colonna da cui si vuole estrarre la sottostringa. L'argomento start è un numero intero che indica la posizione numerica del carattere nella stringa in cui inizia la sottostringa. L'argomento length, come dice il nome, definisce la lunghezza, un valore intero, della sottostringa da restituire.

Come funziona SUBSTRING()?

L'indizio è nel nome stesso della funzione. Una sottostringa è una stringa all'interno della stringa principale. Pertanto, SUBSTRING() estrae una sottostringa come specificato nel suo argomento.

Funziona così:

Funzione di sottostringa sql

Nella stringa precedente, la sottostringa che inizia alla posizione 1 e ha una lunghezza di tre caratteri è ‘STR’.

Ora che i principi sono stati chiariti, vi mostrerò alcuni esempi. Iniziando, ovviamente, da quello più semplice!

Esempio 1: sottostringa di una stringa letterale

La funzione SUBSTRING() restituisce una sottostringa da una stringa qualsiasi. La stringa può essere scritta esplicitamente come argomento, in questo modo:

SELECT SUBSTRING('This is the first substring example', 9, 10) AS substring_extraction;

Questo significa: Voglio trovare una sottostringa dal testo ‘This is the first substring example’. Gli argomenti dicono che la sottostringa inizia dal 9° carattere della stringa e che la sua lunghezza è di 10 caratteri.

Vediamo cosa restituisce questo codice:

substring_extraction
the first

C'è una colonna e una riga. La sottostringa estratta è ‘the first’. Questo è l'uso più elementare di SUBSTRING(); il codice non usa nemmeno le tabelle!

La tabella dei dipendenti

Per mostrarvi esempi più interessanti, ho bisogno di alcuni dati. Vi presento una tabella chiamata employees.

La tabella memorizza le informazioni sui dipendenti di un'azienda immaginaria, Kooler, nelle seguenti colonne:

  • id - L'ID del dipendente.
  • first_name - Il nome del dipendente.
  • last_name - Il cognome del dipendente.
  • email - L'e-mail del dipendente.
  • job_title - Il titolo di lavoro del dipendente.
  • department - Il reparto del dipendente.
  • start_date - La data di inizio del rapporto di lavoro con Kooler.

Ecco le prime righe per avere un'idea dei dati:

idfirst_namelast_nameemailjob_titledepartmentstart_date
1ClarenceWilkinsoncwilkinson@kooler.comJunior Sales AssistantSales09/2021
2MirandaBrownmbrown@kooler.comSenior Sales SpecialistSales01/2020
3FrankDrebinfdrebin@kooler.comJunior Sales ManagerSales08/2019

Esempio 2: Substringa di una colonna

Come si può immaginare, scrivere esplicitamente l'espressione stringa non è l'unico modo per utilizzare SUBSTRING(). È anche possibile utilizzarla su una colonna di una tabella.

Ecco un esempio. Voglio trovare le iniziali di tutti i dipendenti. Uso la colonna email perché so che le prime due lettere dell'indirizzo e-mail sono le iniziali:

SELECT first_name,
	 last_name,
	 email,
	 SUBSTRING(email, 1, 2) AS employee_initials
FROM employees;

Specifico la colonna email nella funzione. Ottenere le prime due lettere dell'indirizzo e-mail significa che la sottostringa inizia dal primo carattere per una lunghezza di due caratteri. In questo modo si ottiene il risultato desiderato:

first_namelast_nameemailemployee_initials
ClarenceWilkinsoncwilkinson@kooler.comcw
MirandaBrownmbrown@kooler.commb
FrankDrebinfdrebin@kooler.comfd
VivienKellyvkelly@kooler.comvk
SteveStephenssstephens@kooler.comss
NastassjaHarrisonnharrison@kooler.comnh
ThomasPetersontpeterson@kooler.comtp
MathildeKinskimkinski@kooler.commk
MateuszWozniakmwozniak@kooler.commw
AineDoyleadoyle@kooler.comad
LorenzoAlfieriaalfieri@kooler.comaa
PetraBabićpbabic@kooler.compb
DuarteSimoesdsimoes@kooler.comds
OlenaKostenkookostenko@kooler.comok
LaurensGrotenhuislgrotenhuis@kooler.comlg

Esempio 3: Substringa senza l'argomento lunghezza

È possibile omettere l'argomento lunghezza in SUBSTRING(), e la funzione funziona comunque. Un buon esempio è quello in cui si vuole mostrare solo l'anno della data di inizio dell'impiego. La colonna start_date non è molto adatta a questo scopo. Questa data è scritta come dato di testo nel formato MM/AAAA.

Fortunatamente, SUBSTRING() risolve questo problema:

SELECT first_name,
	 last_name,
	 start_date,
	 SUBSTRING(start_date, 4) AS start_year
FROM employees;

Per ottenere l'anno dalla colonna start_date è sufficiente definire l'inizio della sottostringa. In questo codice, la sottostringa inizia dal quarto carattere. Poiché ometto l'argomento della lunghezza, la lunghezza della sottostringa è quella che manca alla fine della stringa dal quarto carattere. In questo modo si ottiene facilmente l'anno, come si vede di seguito:

first_namelast_namestart_datestart_year
ClarenceWilkinson09/20212021
MirandaBrown01/20202020
FrankDrebin08/20192019
VivienKelly03/20192019
SteveStephens07/20212021
NastassjaHarrison03/20222022
ThomasPeterson01/20222022
MathildeKinski01/20222022
MateuszWozniak01/20222022
AineDoyle10/20212021
LorenzoAlfieri10/20212021
PetraBabić05/20212021
DuarteSimoes04/20202020
OlenaKostenko11/20192019
LaurensGrotenhuis06/20172017

Esempio 4: POSITION() e CHARINDEX()

Torniamo a lavorare con le e-mail. Per politica aziendale, il punto locale di un indirizzo e-mail (cioè la parte prima di '@') è anche il nome utente del dipendente per accedere a tutte le applicazioni aziendali. È necessario estrarre questo nome utente. Ecco come fare:

SELECT first_name,
       last_name,
	 SUBSTRING (email, 1, POSITION('@' IN email)-1) AS username
FROM employees;

I primi due argomenti sono quelli già visti. Voglio estrarre una sottostringa dalla colonna email e voglio che inizi dal primo carattere della stringa. Ma ora la lunghezza della sottostringa è diversa per ogni dipendente. Come faccio a dire alla funzione di restituire tutti i caratteri prima del segno '@'?

Uso POSITION(), che è equivalente a CHARINDEX() in SQL Server o MySQL. Individua il carattere specificato nella stringa e ne restituisce la posizione numerica. Quindi, la lunghezza della sottostringa che rappresenta il nome utente del dipendente è uguale a POSITION('@' IN email)-1. Perché meno uno? Perché non voglio che '@' sia incluso nel nome utente del dipendente.

Questo è il risultato:

first_namelast_nameusername
ClarenceWilkinsoncwilkinson
MirandaBrownmbrown
FrankDrebinfdrebin
VivienKellyvkelly
SteveStephenssstephens
NastassjaHarrisonnharrison
ThomasPetersontpeterson
MathildeKinskimkinski
MateuszWozniakmwozniak
AineDoyleadoyle
LorenzoAlfieriaalfieri
PetraBabićpbabic
DuarteSimoesdsimoes
OlenaKostenkookostenko
LaurensGrotenhuislgrotenhuis

Esempio 5: LENGTH() + POSITION()

L'ultimo esempio mostra come trovare la posizione lavorativa di un dipendente a partire dai dati. Lavorando in Kooler, so come vengono formati i titoli delle mansioni: prima viene l'anzianità del dipendente, poi il reparto, quindi la posizione. Ad esempio, "Assistente alle vendite junior" significa che il dipendente ha un'anzianità di servizio inferiore, lavora nelle vendite e come assistente.

Utilizzando SQL, è possibile estrarre questo dato come sottostringa:

SELECT first_name,
       last_name,
       job_title,
       SUBSTRING(job_title, LENGTH(job_title) - POSITION(' ' IN REVERSE(job_title))+2) AS position
FROM employees;

Questo è un altro esempio di omissione dell'argomento lunghezza, anche se un po' più complesso. Come sempre, per prima cosa devo specificare la colonna della stringa - in questo caso job_title. Dopodiché, devo in qualche modo trovare una sottostringa composta solo dall'ultima parola del titolo del lavoro.

Lo faccio utilizzando prima LENGTH(). Questo restituisce la lunghezza della stringa nella colonna job_title. È un inizio: è la lunghezza di tutte e tre le parole insieme, compresi gli spazi vuoti. Se potessi in qualche modo sottrarre il numero di caratteri dell'ultima parola, avrei la lunghezza delle prime due parole, che mi darebbe l'inizio della sottostringa desiderata.

È un po' complicata perché i nomi delle posizioni lavorative hanno lunghezze diverse. L'unica cosa che separa le parole è lo spazio bianco. Quindi, per ottenere la lunghezza della terza parola nella stringa, devo contare il numero di caratteri fino allo spazio vuoto, ma da destra.

La funzione POSITION() salva di nuovo la situazione, ma questa volta in combinazione con REVERSE(). La funzione REVERSE() inverte l'espressione della stringa in modo che "Junior Sales Assistant" diventi "tnatsissA selaS roinuJ". L'ultima parola diventa la prima; anche la parola stessa è invertita, ma questo non ha importanza.

POSITION() trova la posizione dello spazio vuoto dopo la prima parola della stringa invertita. Questa posizione è uguale a quella dello spazio vuoto prima dell'ultima parola della stringa originale (non invertita).

Uff! Ora, se sottraggo questo numero dalla lunghezza totale della stringa originale, ottengo l'inizio della sottostringa, giusto?

Beh, non proprio! Utilizzando questa differenza si ottiene una sottostringa che include l'ultima lettera della seconda parola e lo spazio vuoto prima dell'ultima parola. Perché?

Per due motivi. L'argomento iniziale della funzione SUBSTRING() è inclusivo. Inoltre, POSITION() calcola la posizione dello spazio vuoto, non il numero di caratteri fino allo spazio vuoto. Quindi, devo aggiungere 2 per ottenere questo risultato:

first_namelast_namejob_titleposition
ClarenceWilkinsonJunior Sales AssistantAssistant
MirandaBrownSenior Sales SpecialistSpecialist
FrankDrebinJunior Sales ManagerManager
VivienKellySenior Sales ManagerManager
SteveStephensJunior Sales SpecialistSpecialist
NastassjaHarrisonJunior Sales SpecialistSpecialist
ThomasPetersonJunior Reporting SpecialistSpecialist
MathildeKinskiJunior Reporting AnalystAnalyst
MateuszWozniakSenior Reporting ExpertExpert
AineDoyleJunior Reporting ManagerManager
LorenzoAlfieriSenior Reporting ManagerManager
PetraBabićJunior HR AssistantAssistant
DuarteSimoesJunior HR AssistantAssistant
OlenaKostenkoSenior HR AssistantAssistant
LaurensGrotenhuisSenior HR ManagerManager

Ora che ho introdotto alcune altre funzioni, potreste voler dare un'occhiata ad altre funzioni di testo che potrebbero esservi utili.

Ulteriori informazioni su SUBSTRING () e sul lavoro con i dati di testo

Ora sapete quando e come usare SUBSTRING(). È ora di fare pratica!

Esistono altre funzioni di testo, non solo SUBSTRING(). Potete trovarle (e molto altro ancora!) nel corso Standard SQL Functions corso.

Non siete ancora sicuri che il corso sia adatto a voi? Ecco una descrizione dettagliata di ciò che il corso tratta e di come vi aiuterà.