Corso
Le espressioni condizionali sono tra gli elementi più fondamentali di qualsiasi paradigma di programmazione. Le espressioni condizionali più comuni includono i blocchi if-else e i casi switch. In PostgreSQL puoi formulare espressioni condizionali usando WHEN-THEN case, molto simile ai blocchi if-else. In questo tutorial imparerai come fare.
Prima di iniziare a scrivere query condizionali, è importante configurare un database PostgreSQL locale. Lo farai nella prima sezione di questo tutorial.
Nota: per seguire questo tutorial devi conoscere le basi di SQL e PostgreSQL. Se vuoi ripassare, dai un'occhiata a queste risorse:
Configurare un database PostgreSQL in locale
Per configurare il database, puoi seguire questo articolo. Dopo aver ripristinato correttamente il backup, dovresti vedere queste tabelle nel database:
- countries
- route_table
- station_table
- train_table
Questo tutorial, però, usa solo la tabella countries. Sentiti libero di esplorare le tabelle incluse nel backup del database. Inoltre, potresti voler creare tuoi database e tabelle. Se hai ripristinato il backup del database, dovresti avere una tabella (popolata con informazioni su diversi paesi in tutto il mondo). Vediamo ora molto brevemente la tabella countries.
Esplorare brevemente la tabella countries
Dopo aver ripristinato il database, puoi visualizzare la tabella nell'interfaccia pgAdmin inclusa nell'installazione predefinita di PostgreSQL. Eseguendo una semplice istruzione SELECT, puoi conoscere le colonne, i relativi tipi di dato e anche le righe contenute nella tabella -

La tabella contiene dettagli su un totale di 206 paesi di varie regioni del mondo. Quante regioni esattamente? La query seguente dovrebbe darti la risposta.
SELECT COUNT(DISTINCT(region)) from countries;
Risulta che in questa tabella sono coperte 23 regioni diverse, come Europa occidentale, Polinesia, Medio Oriente e così via. Puoi esplorare la tabella con le tue domande rapide e lungo il percorso potresti scoprire fatti interessanti. Passiamo ora all'anatomia di un CASE di base in PostgreSQL.
Introduzione a PostgreSQL CASE
Di seguito trovi la forma generale di un case PostgreSQL con costrutto WHEN-THEN -
CASE
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
...
ELSE result_n
END
Ecco alcuni punti critici da tenere a mente quando costruisci i CASE in PostgreSQL:
-
Ogni condizione è un'espressione booleana e in base al suo output viene scelto il risultato. Se tutte le espressioni corrispondenti a
WHENrisultanoFalse, viene mostrato il risultato della parteELSE. Se non specifichi la parteELSE, la query restituirà null. -
Di solito una condizione si applica a una colonna presente nella tabella su cui stai operando. Costrutti di query condizionali come il precedente si usano tipicamente con le istruzioni
SELECT. Tieni presente che la colonna su cui specifichi le espressioni booleane (nelCASE) deve essere presente nell'istruzioneSELECTdella tua query. Ma quando usiCASEinsieme a una clausola where, non è necessario seguire questa regola (ne parleremo più avanti). -
Il tipo di dato dei risultati deve essere uniforme. Non puoi restituire una
stringinresult_1e unintegerinresult_2e così via.
Passiamo ora ad alcuni esempi.
Scrivere i CASE in PostgreSQL
Partiamo dal semplice. Ora scriverai un CASE per raggruppare i paesi in base all'anno di indipendenza. Gli anni di indipendenza sono registrati nella colonna indep_year. Supponiamo di avere tre gruppi di anni di indipendenza dei paesi da seguire. Creerai tre gruppi di anni di indipendenza per questo -
- Prima del 1900 (
indep_year < 1900) - Tra il 1900 e il 1930 (
indep_year <= 1930) - Dopo il 1930 (
indep_year > 1930)
Il risultato finale della query dovrebbe contenere le seguenti colonne -
- name (del paese)
- continent (a cui appartiene il paese)
- indep_year
- E il gruppo di anni di indipendenza che creerai. Chiamiamolo
indep_year_group.
Scriviamo ora la query -
SELECT name, continent, indep_year,
CASE WHEN indep_year < 1900 THEN 'before 1900'
WHEN indep_year <= 1930 THEN 'between 1900 and 1930'
ELSE 'after 1930' END
AS indep_year_group
FROM countries
ORDER BY indep_year_group;
(La query è ispirata al corso di DataCamp Joining Data in SQL.)
Eseguendo la query, vedrai molti paesi come Palestina, Porto Rico, ecc. per i quali nella tabella non è indicato l'anno di indipendenza. Di conseguenza sono finiti nel gruppo between 1900 and 1930.
I CASE in PostgreSQL possono avere condizioni multiple. Ci sono alcune voci nella tabella in cui il nome del paese e la capitale coincidono. Puoi aggiungere questa condizione al CASE che hai appena costruito -
SELECT name, continent, indep_year,
CASE WHEN (indep_year < 1900) AND (countries.name = countries.capital) THEN 'before 1900 and capital same'
WHEN indep_year <= 1930 AND (countries.name = countries.capital) THEN 'between 1900 and 1930 and capital same'
ELSE 'after 1930_and_no_same_capital' END
AS indep_year_group
FROM countries
ORDER BY indep_year_group;
Un altro aspetto interessante dei CASE è che puoi abbinarli a funzioni di aggregazione come SUM(). Per implementare un CASE con la funzione di aggregazione SUM(), ti servirà una tabella diversa in cui abbia senso farlo. Creiamo una semplice tabella chiamata student_grades con le seguenti colonne e tipi di dato -
- student_name (stringa)
- student_stream (stringa)
- student_grade (carattere)
La seguente query crea la tabella -
CREATE TABLE student_grades
(student_name character varying,
student_stream character varying,
student_grade character);
Inseriamo ora alcuni record nella tabella. Puoi farlo con alcune istruzioni INSERT. Supponiamo che, dopo gli inserimenti, la tabella student_grades contenga i seguenti record -

Ora scriverai un CASE per ottenere la somma degli studenti che appartengono a determinati gruppi di voti. Come puoi vedere, negli esempi della tabella ci sono tre voti distinti: A, B e C. La query condizionale dovrebbe restituire un output simile al seguente -

La query per questo è -
SELECT
SUM (
CASE
WHEN student_grade = 'A' THEN
1
ELSE
0
END
) AS "High Scoring",
SUM (
CASE
WHEN student_grade = 'B' THEN
1
ELSE
0
END
) AS "Mid Scoring",
SUM (
CASE
WHEN student_grade = 'C' THEN
1
ELSE
0
END
) AS "Low Scoring"
FROM
student_grades;
Ecco come puoi abbinare CASE a funzioni di aggregazione per ricavare informazioni interessanti sui dati.
Conclusione e letture consigliate
Questo è tutto per il tutorial. In questo tutorial hai imparato a inserire condizioni in stile if-then nelle tue query SQL per ottenere report interessanti. Hai lavorato su diversi esempi per rafforzare questa abilità. Se cerchi esercizi più impegnativi, dovresti seguire i seguenti corsi DataCamp su SQL -
Scrivimi pure le tue domande su questo tutorial nella sezione Comments.

