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

Funzione SQL CAST(): Panoramica

La funzione SQL CAST() converte un tipo di dati in un altro. Questo articolo spiega a cosa serve questa funzione e quando e come utilizzarla.

Nei database relazionali, ogni colonna ha un tipo di dati definito che controlla il tipo di dati memorizzati nella colonna e il modo in cui tali dati possono essere utilizzati. Ad esempio, la descrizione di un prodotto sarà probabilmente memorizzata come stringa di testo e non potrà essere utilizzata per l'aritmetica (ad esempio, per calcolare i totali).

D'altra parte, il saldo di un cliente sarà memorizzato come dato numerico e potrà essere utilizzato per i calcoli. SQL dispone di serie separate di funzioni per le operazioni numeriche e per la manipolazione delle stringhe.

Occasionalmente, è possibile ignorare queste regole e trattare una colonna in modo diverso dalle operazioni abituali del suo tipo di dati. È qui che diventa utile la funzione SQL CAST(). Essa converte un dato in un tipo di dato diverso all'interno della query. Più avanti nel corso dell'articolo verranno illustrati alcuni esempi di casi in cui è necessario eseguire questa operazione.

Se volete approfondire la conoscenza di SQL, date un'occhiata al nostro percorso di apprendimento SQL dalla A alla Z. Questa serie di 7 corsi vi porta dai principianti fino agli argomenti più avanzati di SQL. Potrete fare esperienza pratica attraverso più di 700 esercizi guidati e acquisire familiarità con i concetti di database relazionale. Tutto ciò che serve è un browser e una connessione a Internet, e l'aiuto è disponibile a ogni passo.

Sintassi della funzione SQL CAST()

La funzione CAST() ha la stessa semplice sintassi in tutti i dialetti SQL:

CAST(value AS type)

  • valore può essere qualsiasi valore SQL valido. Può essere il nome di una colonna, il risultato di un calcolo, il risultato di una funzione o un valore letterale.
  • type è il tipo di dati desiderato, cioè quello in cui si vuole convertire il valore.

A titolo di esempio, si supponga che la colonna date_hired nella tabella employee sia stata definita come tipo di dati DATE. Si desidera popolarla con la data di oggi utilizzando la funzione GETDATE(), che restituisce un valore di tipo DATETIME.

È possibile convertire il valore DATETIME in un valore DATE utilizzando questa sintassi:

INSERT INTO employee (date_hired)
VALUES (CAST(GETDATE() AS DATE));

Esempi di funzioni CAST()

Vediamo alcuni esempi di come CAST() può essere utilizzato nel lavoro quotidiano.

1. Utilizzo di numeri come stringhe

Una tabella denominata employee ha il campo dipartimento, definito come tipo di dati INT (integer). Le prime tre cifre di questo codice indicano il settore dell'organizzazione.

La direzione vuole sapere quante persone sono impiegate in ogni sezione. A tal fine, è necessario estrarre le prime tre cifre del reparto. Dobbiamo convertire questo valore INT in un valore VARCHAR, quindi utilizzare la funzione stringa LEFT() per recuperare i primi tre caratteri.

La query si presenta come segue:

SELECT 
  LEFT(CAST (department AS VARCHAR(15)), 3) AS section, 
  COUNT(*) AS employee_count
FROM employee
GROUP BY LEFT(CAST (department AS VARCHAR(15)), 3)
ORDER BY LEFT(CAST (department AS VARCHAR(15)), 3);

Si noti che CAST() è incorporata nella funzione LEFT() e che le funzioni devono essere ripetute nelle clausole GROUP BY e ORDER BY.

2. Unire tabelle su colonne con tipi di dati diversi

La tabella employee dell'esempio precedente deve essere unita a un'altra tabella department_details, il cui campo codice è definito come VARCHAR. Normalmente, unendo la colonna reparto in employee alla colonna code nella colonna department_details si otterrebbe un errore, poiché i campi hanno tipi di dati diversi. Sappiamo che il codice del reparto sarà sempre numerico, quindi possiamo aggirare il problema lanciando il codice come un intero.

La query avrebbe il seguente aspetto:

SELECT department_name, name, date_hired
FROM employee
JOIN department_details 
ON department = CAST(code AS int);

3. Modifica dei tipi di campo in un'operazione ETL

Un processo di produzione dispone di sensori in vari punti che generano uno stato di allarme ogni volta che si verifica una condizione insolita. Questi allarmi vengono caricati automaticamente in una tabella denominata alarms. Un processo giornaliero copia le righe da alarms in una tabella di magazzino denominata alarm_historyche può essere utilizzata per l'analisi. La tabella alarms viene poi cancellata.

La tabella alarms si presenta come segue:

clock_time 		varchar(20),
sensor_no 		int,
status_code 	char(2)

La tabella alarm_history è simile, ma l'ora dell'orologio deve essere memorizzata come DATETIME, poiché i gestori dovranno estrarla e analizzarla in base a un intervallo di date. È definita in questo modo:

clock_time 		datetime,
sensor_no 		int,
status_code 	char(2)

La query che copia i dati in alarm_history deve convertire il VARCHAR clock_time in un tipo di dati DATETIME. L'aspetto è questo:

INSERT INTO alarm_history
SELECT 
  CAST(clock_time AS DATETIME),
  sensor_no,
  status_code
FROM alarms;

Quando usare CAST()

Vediamo alcuni scenari in cui la funzione SQL CAST() può essere utile.

  • Operazioni ETL (Extract, Transform, Load): L'ETL prende i dati da una o più fonti e li trasforma nella forma necessaria per un uso diverso. Ad esempio, si possono prendere i dati memorizzati in un sistema utilizzato per le operazioni quotidiane di un'azienda e caricarli in un data warehouse adatto alle analisi di marketing. I tipi di dati del data warehouse possono essere diversi da quelli del sistema originale, quindi è importante CAST().
  • Utilizzo di funzioni appartenenti a un tipo di dati diverso: Può capitare che si vogliano usare funzioni di stringa su dati numerici, ad esempio per formattare i dati in un report. Allo stesso modo, si possono usare funzioni numeriche e aggregati su dati di tipo stringa (a condizione che si sappia che la colonna contiene numeri).
  • Unire tabelle su colonne con tipi di dati diversi: Questo non accade di solito se il database è stato ben progettato, ma nella pratica può accadere.
  • Lavorare con date memorizzate come stringhe. I progettisti di database a volte memorizzano le date come stringhe di testo; tali date non possono essere utilizzate per le funzioni e i calcoli della data. Si può ovviare a questo problema utilizzando CAST().
  • Utilizzo di SQL dinamico: Se si scrivono programmi o stored procedure, può essere necessario incorporare i dati in una stringa per costruire una query dinamica.

Se la query restituisce un errore a causa di una mancata corrispondenza del tipo di dati, la funzione CAST() è probabilmente la soluzione al problema.

Tipi di dati supportati dai più diffusi dialetti di SQL

1. SQL Server

SQL Server consente di utilizzare qualsiasi tipo di dati valido come parametro di tipo nella funzione CAST(). Alcune conversioni non sono consentite se i tipi di dati non sono compatibili. È possibile verificare quali conversioni sono consentite nella documentazione T-SQL.

Per una trattazione completa della funzione CAST() in SQL Server, consultare la documentazione Microsoft sulle funzioni CAST() e CONVERT().

2. MySQL

MySQL non è standard in quanto non utilizza il tipo di dati per il parametro type. Ha invece un insieme fisso di valori consentiti:

  • BINARY
  • CHAR (Nota: questo tipo viene utilizzato per qualsiasi tipo di valore stringa, ad esempio VARCHAR o TEXT. Il motore del database deciderà il tipo di dati prodotto in base alla lunghezza del testo).
  • DATE
  • DATETIME
  • DECIMAL
  • DOUBLE
  • FLOAT
  • JSON
  • NCHAR
  • REAL
  • SIGNED
  • SPACIAL_TYPE
  • UNSIGNED
  • YEAR

Ulteriori informazioni su CAST() sono disponibili nel manuale di riferimento di MYSQL.

3. Oracle

Oracle utilizza il tipo di dati per il parametro type. La documentazione contiene una tabella dei tipi di dati validi per la conversione.

4. PostgreSQL

PostgreSQL utilizza il tipo di dati per il parametro type. La documentazione di PostgreSQL non indica esplicitamente quali conversioni sono consentite, ma le conversioni standard tra stringhe, numeri e date vanno bene.

PostgreSQL consente di creare le proprie regole di casting per le conversioni non standard utilizzando la funzione CREATE_CAST.

Cosa succede con la funzione SQL CAST()?

Abbiamo fatto un'introduzione approfondita alla funzione SQL CAST() e al suo utilizzo. Se siete alla ricerca di un programma di studio completo che copra non solo le nozioni di base, ma anche argomenti avanzati, tra cui CAST(), vi raccomando ancora una volta il nostro percorso SQL dalla A alla Z. È ricco di consigli utili, esercizi pratici e approfondimenti di esperti.

Buona fortuna e buon apprendimento!