ProgrammazioneSviluppatore SQL

Spiega come funziona la gestione di NULL in SQL. Quali sono i rischi dei valori NULL inaspettati, come lavorare correttamente con essi e quali errori tipici si possono incontrare?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

In SQL, il valore NULL indica un valore "sconosciuto" o "inesistente". Si comporta in modo particolare:

  • Il confronto di NULL con qualsiasi valore attraverso = o <> dà sempre il risultato UNKNOWN, e non TRUE o FALSE.
  • La presenza di NULL deve essere verificata usando IS NULL o IS NOT NULL.
  • Qualsiasi operazione aritmetica o logica con NULL darà NULL.

Esempio:

SELECT * FROM users WHERE name = NULL; -- non restituirà alcuna riga SELECT * FROM users WHERE name IS NULL; -- corretto SELECT 1 + NULL; -- Risultato: NULL

Per sostituire NULL si utilizzano funzioni come COALESCE(foo, 0) (prende il primo valore non-NULL) o ISNULL(foo, 'default') in SQL Server.

Domanda trabocchetto.

Domanda: Quale risultato restituirà la condizione WHERE some_column <> 'value' nelle righe in cui some_column è NULL?

Risposta:

In queste righe la condizione non sarà soddisfatta: il confronto con NULL darà UNKNOWN, e non TRUE. Pertanto, le righe con NULL non verranno selezionate.

Esempio:

-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- La riga con NULL non verrà inclusa

Storia

Nel rapporto della banca, la condizione WHERE status <> 'closed' erroneamente non considerava i conti con valore status = NULL (ad esempio, nuove richieste). Di conseguenza, il numero di conti attivi è risultato inferiore del 15%.

Storia

Nel servizio online di personalizzazione delle email, COALESCE(user_name, 'Gentile cliente') è stato dimenticato nell'invio. Quasi mille clienti hanno ricevuto comunicazioni senza nome, interpretandolo come un errore di automazione.

Storia

Durante la migrazione del database, LEFT JOIN restituiva più righe di quanto ci si aspettasse. Si è scoperto che nella tabella a sinistra c'erano campi con NULL; filtri come WHERE b.field = 'X' dopo il JOIN scartavano queste righe, causando la perdita di parte dei dati.