Sorting e formattazione — sono cose logiche e utili. Ma a volte ci si può confondere e ottenere risultati inaspettati. Dai, vediamo insieme gli errori più frequenti così i tuoi dati saranno sempre perfetti e nell’ordine giusto!
1. Sorting di dati di tipi diversi
Immagina questa situazione: stai facendo la sorting di una tabella su una colonna che contiene sia numeri che stringhe. PostgreSQL ovviamente ci prova ad aiutarti, ma il risultato può sorprenderti. Per esempio hai una tabella dove value è testo:
| id | value |
|---|---|
| 1 | 10 |
| 2 | 2 |
| 3 | apple |
| 4 | 20 |
E scrivi la query:
SELECT *
FROM mixed_data
ORDER BY value;
Risultato atteso? Magari: 2, 10, 20, apple? Nope, PostgreSQL fa la sorting delle stringhe in base all’ordine lessicografico/alfabetico, quindi il risultato sarà: 10, 2, 20, apple.
Come evitare l’errore?
Se sai che la tua colonna testo contiene numeri, converti esplicitamente in numero prima della sorting:
SELECT * FROM mixed_data ORDER BY value::INT;
Ora il risultato sarà: 2, 10, 20.
Ma occhio: se nella colonna ci sono stringhe che non si possono convertire in numeri, la query ti darà errore!
2. Specificare più colonne per la sorting
Uno degli errori classici — dimenticare la priorità quando fai la sorting su più colonne. Tipo, vuoi ordinare gli studenti per cognome e poi per età, ma sbagli l’ordine:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
La tua query:
-- Sorting sbagliata
SELECT *
FROM students
ORDER BY age, last_name;
Risultato:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 3 | Song | 19 |
| 2 | Lin | 20 |
Qui PostgreSQL ordina prima per età, poi per cognome. Non proprio quello che volevi, vero?
Query giusta:
SELECT *
FROM students
ORDER BY last_name, age;
Risultato:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Ora la sorting è prima per cognome, poi per età all’interno dello stesso cognome. Proprio come volevi!
3. Sorting con direzioni diverse
A volte serve fare la sorting su più colonne con direzioni diverse. Tipo, ordinare i prodotti per categoria (crescente), e dentro ogni categoria per prezzo (decrescente). L’errore è dimenticare di specificare la direzione sulla seconda colonna:
| id | category | price |
|---|---|---|
| 1 | Electronics | 99.99 |
| 2 | Electronics | 199.99 |
| 3 | Furniture | 299.99 |
| 4 | Furniture | 199.99 |
La tua query:
-- Sorting sbagliata
SELECT *
FROM products
ORDER BY category, price;
Risultato: i prezzi dentro le categorie sono ordinati in modo crescente, ma magari volevi il contrario.
Query giusta:
SELECT *
FROM products
ORDER BY category ASC, price DESC;
Errori nella formattazione
4. Uso sbagliato di CONCAT()
Metti che vuoi unire nome e cognome in una stringa, ma di fretta ti dimentichi lo spazio tra i due:
| id | first_name | last_name |
|---|---|---|
| 1 | John | Doe |
| 2 | Jane | Smith |
La tua query:
SELECT
CONCAT(first_name, last_name) AS full_name
FROM employees;
Risultato:
| full_name |
|---|
| JohnDoe |
| JaneSmith |
Come sistemare?
Aggiungi uno spazio tra nome e cognome:
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
Ora tutto sarà molto più bello:
| full_name |
|---|
| John Doe |
| Jane Smith |
5. Errori con CAST()
Metti che vuoi convertire una data in stringa per mostrarla meglio, ma ti dimentichi di specificare il formato:
| id | event_date |
|---|---|
| 1 | 2023-01-15 |
La tua query:
-- Conversione sbagliata
SELECT
CAST(event_date AS TEXT)
FROM events;
Risultato: la data viene convertita in formato YYYY-MM-DD, che non sempre è comodo per chi legge.
Come sistemare?
Usa la funzione TO_CHAR() per specificare il formato:
SELECT
TO_CHAR(event_date, 'DD-MM-YYYY') AS formatted_date
FROM events;
Ora la data sarà visualizzata come 15-01-2023.
6. Errori con DISTINCT
DISTINCT — è una bomba per tirare fuori valori unici, ma a volte lo si usa male. Tipo, vuoi la lista dei nomi unici dei dipendenti:
SELECT DISTINCT first_name, last_name
FROM employees;
A prima vista sembra ok, ma se due dipendenti hanno lo stesso nome e cognome, verranno mostrati come un solo risultato, anche se sono persone diverse.
Esempio dati:
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Risultato della query:
| first_name | last_name |
|---|---|
| Alex | Lin |
| Maria | Chi |
Come evitare l’errore?
Aggiungi la chiave primaria per garantire l’unicità:
SELECT DISTINCT ON (id) first_name, last_name
FROM employees;
Risultato della query con DISTINCT ON (id):
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Come evitare errori?
Lavorare con i dati richiede attenzione ai dettagli. Per evitare gli errori di cui sopra:
Controlla i tipi di dati: assicurati che le funzioni che usi supportino i tipi delle tue colonne.
Controlla l’ordine di sorting: assicurati che le colonne siano nell’ordine giusto. Non dimenticare le direzioni di sorting ASC, DESC.
Testa le query su piccoli set di dati: così puoi beccare gli errori subito.
Non dimenticare la documentazione di PostgreSQL: ti aiuta a risolvere i dubbi sulle funzioni e su come usarle. Ecco il link: doc ufficiale PostgreSQL.
Ora sei pronto a risolvere qualsiasi mistero di formattazione e sorting! Andiamo avanti.
GO TO FULL VERSION