Immagina di voler sommare due numeri, ma uno dei parametri è salvato come stringa. Oppure vuoi filtrare i dati per anno, ma la data è salvata nel formato completo con l’orario. PostgreSQL potrebbe non essere molto felice di questa cosa, e dovrai intervenire per portare i dati al tipo giusto.
La conversione dei tipi ti aiuta a:
- Semplificare la gestione dei dati per usarli nei calcoli.
- Creare dati più leggibili e strutturati per esportazione o analisi.
- Eliminare errori legati a incompatibilità tra tipi di dati.
Basi della conversione dei tipi di dati: CAST() e ::
1. CAST() — il fratello maggiore di ogni conversione
La funzione CAST() è il modo “ufficiale” per convertire valori da un tipo di dato a un altro. Funziona come un traduttore universale.
Sintassi:
CAST(valore AS tipo_di_dato_destinazione)
Esempio 1: Conversione di una stringa in numero.
SELECT CAST('123' AS INTEGER); -- Risultato: 123
Esempio 2: Conversione di un numero in stringa.
SELECT CAST(123 AS TEXT); -- Risultato: '123'
Esempio 3: Conversione di una data in stringa.
SELECT CAST(NOW() AS TEXT); -- Risultato: '2023-10-25 15:00:00.000000'
2. Operatore :: — alternativa compatta
Se CAST() ti sembra un po’ prolisso, PostgreSQL offre la sintassi ::. È un modo abbreviato per convertire, molto popolare proprio perché è super corto.
Sintassi:
valore::tipo_di_dato_destinazione
Esempio 1: Conversione di una stringa in numero.
SELECT '123'::INTEGER; -- Risultato: 123
Esempio 2: Conversione di un numero in stringa.
SELECT 123::TEXT; -- Risultato: '123'
Esempio 3: Conversione di una data in stringa.
SELECT NOW()::TEXT; -- Risultato: '2023-10-25 15:00:00.000000'
Esempi reali di uso della conversione dei tipi
1. Conversione tra numeri e stringhe
Supponiamo che tu abbia una tabella students dove la colonna student_id è salvata come stringa, ma vuoi confrontarla con un valore numerico. Senza conversione non funziona.
| student_id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 101 | Alex | Lin | 2008-03-15 | 9 |
| 102 | Maria | Chi | 2009-07-22 | 8 |
| 103 | Axel | Ivy | 2007-11-30 | 10 |
| 104 | Nat | Sok | 2008-01-18 | 9 |
| 105 | Pol | Frez | 2009-05-05 | 8 |
Quindi nella query devi convertire esplicitamente la colonna student_id in numero:
SELECT *
FROM students
WHERE student_id::INTEGER = 101;
Query analoga usando CAST():
SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;
Conversione delle date
Quando vuoi estrarre una parte della data o convertirla in stringa, anche qui la conversione dei tipi ti salva. Per esempio, hai una tabella courses con le date di inizio corso nella colonna start_date.
| course_id | course_name | start_date |
|---|---|---|
| 1 | Introduzione a Python | 2025-01-15 |
| 2 | Basi di SQL | 2025-03-01 |
| 3 | Analisi dei dati | 2025-05-10 |
| 4 | Sviluppo web | 2025-06-20 |
| 5 | Machine learning | 2025-09-05 |
Esempio: Estrarre l’anno come numero.
SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;
Il risultato sarà così:
| start_date (DATE) | start_date (TEXT) | start_date (TIMESTAMP) |
|---|---|---|
| 2025-01-15 | 2025-01-15 | 2025-01-15 00:00:00 |
| 2025-03-01 | 2025-03-01 | 2025-03-01 00:00:00 |
| 2025-05-10 | 2025-05-10 | 2025-05-10 00:00:00 |
| 2025-06-20 | 2025-06-20 | 2025-06-20 00:00:00 |
| 2025-09-05 | 2025-09-05 | 2025-09-05 00:00:00 |
Esempio: Convertire la data in una “stringa pulita”.
SELECT TO_CHAR(start_date, 'DD-MM-YYYY')
Il risultato sarà così:
| to_char |
|---|
| 15-01-2025 |
| 01-03-2025 |
| 10-05-2025 |
| 20-06-2025 |
| 05-09-2025 |
Errore: Quando la conversione si rompe?
Il trucco della conversione dei dati non funziona sempre. A volte PostgreSQL ti fa capire chiaramente che “non capisce” le tue intenzioni. Ecco un esempio classico: provi a convertire un testo che sembra un numero, ma dentro ci sono caratteri in più.
Esempio di errore:
SELECT '123abc'::INTEGER;
-- ERRORE: sintassi di input non valida per il tipo integer: "123abc"
Per evitare questi problemi, assicurati che i dati possano davvero essere convertiti nel tipo di destinazione in anticipo. Ad esempio, puoi usare espressioni regolari o controlli aggiuntivi.
GO TO FULL VERSION