DataSunrise Consegue la Certificazione AWS DevOps Competency per AWS DevSecOps e Monitoraggio, Logging e Performance

Migliorare le Query Redshift con Espressioni CASE WHEN

Migliorare le Query Redshift con Espressioni CASE WHEN

Redshift Case When

Introduzione

Quando si utilizza il data warehouse Redshift di Amazon, potrebbe essere necessario utilizzare la logica condizionale per interrogare e trasformare i dati. L’espressione ‘CASE WHEN’ aiuta a valutare condizioni e restituire risultati diversi a seconda che le condizioni siano vere o false.

In questo articolo, esploreremo le basi dell’uso delle espressioni ‘CASE WHEN’ in Redshift SQL. Tratteremo anche la clausola ELSE durante la nostra discussione. Imparerai la sintassi, vedrai esempi e comprenderai gli usi comuni. Alla fine, sarai attrezzato per sfruttare questa essenziale logica SQL condizionale nelle tue query Redshift.

Sintassi CASE WHEN

La sintassi generale per un’espressione CASE WHEN in Redshift è:

CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END

Come funziona:

  • La parola chiave CASE segnala l’inizio dell’espressione condizionale
  • Si specificano una o più clausole WHEN che contengono ciascuna una condizione da valutare
  • Per la prima condizione che risulta vera, viene restituito il risultato THEN corrispondente
  • Se nessuna delle condizioni è vera, viene restituito il default_result di ELSE
  • La parola chiave END segnala la fine dell’espressione CASE

Guardiamo un semplice esempio per illustrare. Immagina una tabella “users” con colonne per id, nome, ed età. Per categorizzare gli utenti come ‘bambino’, ‘adulto’, o ‘anziano’ in base all’età, potresti usare:

SELECT id, name,
CASE
WHEN age < 18 THEN 'bambino'
WHEN age < 65 THEN 'adulto'
ELSE 'anziano'
END AS age_category
FROM users;

Questo valuterebbe ogni riga, controllando l’età dell'utente, e restituendo la corrispondente age_category.

Creare Dati d'Esempio

Per dimostrare esempi più complessi di CASE WHEN, creiamo prima dei dati di esempio con cui lavorare. Esegui la seguente SQL in Redshift per creare una tabella "orders":

CREATE TABLE orders (
order_id INT,
customer_id INT,
order_date DATE,
total DECIMAL(10,2),
status VARCHAR(20)
);
INSERT INTO orders
VALUES
(1, 101, '2023-01-15', 150.00, 'completed'),
(2, 102, '2023-02-10', 75.50, 'pending'),
(3, 101, '2023-03-01', 200.00, 'completed'),
(4, 103, '2023-03-05', 120.00, 'cancelled'),
(5, 102, '2023-04-12', 300.00, 'completed');

Questa semplice espressione CASE crea una tabella orders con alcuni record di esempio che ora possiamo utilizzare per eseguire espressioni CASE.

Utilizzare CASE per Derivare Nuove Colonne

Le dichiarazioni CASE possono essere utilizzate per creare nuove colonne in un dataset categorizzando dati esistenti. Quando si organizzano ordini per importo totale, una dichiarazione CASE può impostare le regole per ciascun gruppo.

Ordini inferiori a $100 sono "Basso Valore". La gamma di ordini tra $100 e $500 è "Medio Valore". Ordini superiori a $500 sono "Alto Valore". Puoi facilmente categorizzare i dati in un dataset utilizzando una dichiarazione CASE, che aiuta nell'analisi e nella comprensione.

SELECT order_id, customer_id, total,
CASE
WHEN total < 100 THEN 'piccolo'
WHEN total < 250 THEN 'medio'
ELSE 'grande'
END AS order_size
FROM orders;

Questo restituirebbe:

order_id | customer_id | total  | order_size
----------------------------------------------
1        | 101         | 150.00 | medio
2        | 102         | 75.50  | piccolo
3        | 101         | 200.00 | medio
4        | 103         | 120.00 | medio
5        | 102         | 300.00 | grande

Aggregare con CASE

Le espressioni CASE sono anche molto utili all'interno di funzioni aggregate come SUM() e COUNT(). Ad esempio, per contare il numero di ordini piccoli, medi e grandi:

SELECT
COUNT(CASE WHEN total < 100 THEN 1 END) AS small_orders,
COUNT(CASE WHEN total >= 100 AND total < 250 THEN 1 END) AS medium_orders,
COUNT(CASE WHEN total >= 250 THEN 1 END) AS large_orders
FROM orders;

Questo restituirebbe:

small_orders | medium_orders | large_orders
--------------------------------------------
1            | 3             | 1

All'interno di ciascun COUNT(), il CASE restituisce 1 quando la condizione è soddisfatta, che il COUNT() poi somma.

CASE nelle Clausole WHERE e HAVING

È possibile utilizzare anche espressioni CASE nelle clausole WHERE e HAVING per filtrare i risultati in base alla logica condizionale. Ad esempio, per trovare tutti i clienti che hanno effettuato un ordine 'grande':

SELECT DISTINCT customer_id
FROM orders
WHERE
CASE
WHEN total >= 250 THEN 'grande'
ELSE 'non grande'
END = 'grande';

Questo restituirebbe il cliente 102, poiché è l'unico con un ordine 'grande' sopra i $250.

Gestione dei Valori NULL

Le espressioni CASE sono utili anche per gestire i valori NULL. È possibile utilizzare CASE per sostituire i NULL con un valore predefinito o per applicare una logica diversa quando un valore è NULL.

Ad esempio, considera se la nostra tabella "orders" avesse una colonna "shipped_date" che potrebbe essere NULL se l'ordine non fosse ancora stato spedito. Per restituire 'Non Spedito' per questi ordini:

SELECT order_id, status,
CASE
WHEN shipped_date IS NULL THEN 'Non Spedito'
ELSE CAST(shipped_date AS VARCHAR(10))
END AS shipped
FROM orders;

Questo controlla se shipped_date IS NULL, e in tal caso restituisce 'Non Spedito'. In caso contrario, converte shipped_date in una stringa per la risposta. Notiamo che utilizzare NVL o COALESCE potrebbe essere una scelta migliore.

Consigli per l'Uso di CASE WHEN

Ecco alcuni consigli da tenere a mente quando si utilizzano le espressioni CASE WHEN in Redshift:

  • Le espressioni CASE possono essere annidate l'una dentro l'altra per logiche più complesse
  • La clausola ELSE è opzionale e, se omessa, verrà restituito NULL se nessuna condizione corrisponde
  • Le espressioni CASE possono essere utilizzate quasi ovunque in una dichiarazione SQL, incluse le clausole SELECT, WHERE, HAVING, GROUP BY e ORDER BY
  • Fai attenzione ai tipi di dati - i risultati di un'espressione CASE dovrebbero essere tutti convertibili in un tipo di dato comune

Riepilogo

L'espressione CASE WHEN è uno strumento versatile per applicare la logica condizionale nelle query SQL di Redshift. Puoi usarla per derivare nuove colonne, aggregare dati, filtrare risultati, gestire i NULL e molto altro.

Comprendendo la sintassi e gli usi comuni, sarai in grado di scrivere SQL più potenti ed efficienti per analizzare i tuoi dati in Redshift.

DataSunrise offre strumenti facili da usare e flessibili per la sicurezza del database, l'audit e la conformità che si integrano perfettamente con Amazon Redshift. Visita il sito web di DataSunrise per richiedere una demo online dal nostro team di esperti.

Visita il sito web di DataSunrise per richiedere una demo online dal nostro team di esperti.

Successivo

Clausola LIMIT di Snowflake: Un Utile Strumento di Gestione dei Dati

Clausola LIMIT di Snowflake: Un Utile Strumento di Gestione dei Dati

Scopri di più

Ha bisogno del nostro team di supporto?

I nostri esperti saranno lieti di rispondere alle Sue domande.

Countryx
United States
United Kingdom
France
Germany
Australia
Afghanistan
Islands
Albania
Algeria
American Samoa
Andorra
Angola
Anguilla
Antarctica
Antigua and Barbuda
Argentina
Armenia
Aruba
Austria
Azerbaijan
Bahamas
Bahrain
Bangladesh
Barbados
Belarus
Belgium
Belize
Benin
Bermuda
Bhutan
Bolivia
Bosnia and Herzegovina
Botswana
Bouvet
Brazil
British Indian Ocean Territory
Brunei Darussalam
Bulgaria
Burkina Faso
Burundi
Cambodia
Cameroon
Canada
Cape Verde
Cayman Islands
Central African Republic
Chad
Chile
China
Christmas Island
Cocos (Keeling) Islands
Colombia
Comoros
Congo, Republic of the
Congo, The Democratic Republic of the
Cook Islands
Costa Rica
Cote D'Ivoire
Croatia
Cuba
Cyprus
Czech Republic
Denmark
Djibouti
Dominica
Dominican Republic
Ecuador
Egypt
El Salvador
Equatorial Guinea
Eritrea
Estonia
Ethiopia
Falkland Islands (Malvinas)
Faroe Islands
Fiji
Finland
French Guiana
French Polynesia
French Southern Territories
Gabon
Gambia
Georgia
Ghana
Gibraltar
Greece
Greenland
Grenada
Guadeloupe
Guam
Guatemala
Guernsey
Guinea
Guinea-Bissau
Guyana
Haiti
Heard Island and Mcdonald Islands
Holy See (Vatican City State)
Honduras
Hong Kong
Hungary
Iceland
India
Indonesia
Iran, Islamic Republic Of
Iraq
Ireland
Isle of Man
Israel
Italy
Jamaica
Japan
Jersey
Jordan
Kazakhstan
Kenya
Kiribati
Korea, Democratic People's Republic of
Korea, Republic of
Kuwait
Kyrgyzstan
Lao People's Democratic Republic
Latvia
Lebanon
Lesotho
Liberia
Libyan Arab Jamahiriya
Liechtenstein
Lithuania
Luxembourg
Macao
Madagascar
Malawi
Malaysia
Maldives
Mali
Malta
Marshall Islands
Martinique
Mauritania
Mauritius
Mayotte
Mexico
Micronesia, Federated States of
Moldova, Republic of
Monaco
Mongolia
Montserrat
Morocco
Mozambique
Myanmar
Namibia
Nauru
Nepal
Netherlands
Netherlands Antilles
New Caledonia
New Zealand
Nicaragua
Niger
Nigeria
Niue
Norfolk Island
North Macedonia, Republic of
Northern Mariana Islands
Norway
Oman
Pakistan
Palau
Palestinian Territory, Occupied
Panama
Papua New Guinea
Paraguay
Peru
Philippines
Pitcairn
Poland
Portugal
Puerto Rico
Qatar
Reunion
Romania
Russian Federation
Rwanda
Saint Helena
Saint Kitts and Nevis
Saint Lucia
Saint Pierre and Miquelon
Saint Vincent and the Grenadines
Samoa
San Marino
Sao Tome and Principe
Saudi Arabia
Senegal
Serbia and Montenegro
Seychelles
Sierra Leone
Singapore
Slovakia
Slovenia
Solomon Islands
Somalia
South Africa
South Georgia and the South Sandwich Islands
Spain
Sri Lanka
Sudan
Suriname
Svalbard and Jan Mayen
Swaziland
Sweden
Switzerland
Syrian Arab Republic
Taiwan, Province of China
Tajikistan
Tanzania, United Republic of
Thailand
Timor-Leste
Togo
Tokelau
Tonga
Trinidad and Tobago
Tunisia
Turkey
Turkmenistan
Turks and Caicos Islands
Tuvalu
Uganda
Ukraine
United Arab Emirates
United States Minor Outlying Islands
Uruguay
Uzbekistan
Vanuatu
Venezuela
Viet Nam
Virgin Islands, British
Virgin Islands, U.S.
Wallis and Futuna
Western Sahara
Yemen
Zambia
Zimbabwe
Choose a topicx
Informazioni generali
Vendite
Servizio clienti e supporto tecnico
Richieste di collaborazione e alleanza
Informazioni generali:
info@datasunrise.com
Servizio clienti e supporto tecnico:
support.datasunrise.com
Richieste di collaborazione e alleanza:
partner@datasunrise.com