Restituire NULL quando non esiste l'ennesimo valore
Il caso limite preferito nei colloqui: gestire correttamente un numero insufficiente di righe
Restituire NULL quando non esiste l'ennesimo valore è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Coding Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Coding Interview Prep include 4 lezioni in totale.
Il caso limite che piace agli intervistatori
Dopo che ha risolto correttamente la query per il valore N-esimo più alto, l'intervistatore aggiunge: «Cosa succede se la tabella contiene meno di N stipendi distinti? Voglio un singolo NULL, non un risultato vuoto.»
È questa la domanda che distingue chi ha memorizzato una query da chi comprende il comportamento degli insiemi di risultati. Molte soluzioni restituiscono silenziosamente zero righe invece di una riga contenente NULL.
Questa lezione riguarda proprio il modo di forzare esattamente una riga di output, il cui valore sia NULL quando il valore N-esimo non esiste.
Perché DENSE_RANK da solo non restituisce righe
Ricordi la query standard per il valore N-esimo più alto. Se esistono solo due stipendi distinti e si cerca il terzo, WHERE rnk = 3 non trova corrispondenze, quindi la query restituisce un insieme vuoto: zero righe.
Un insieme vuoto non equivale a una riga contenente NULL. Se la specifica richiede di «restituire NULL», un risultato vuoto non supera il test, anche se la logica sottostante è corretta.
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = 3; -- returns NO rows if fewer than 3 distinct salariesCorrezione 1: racchiudere la query in una SELECT esterna
La correzione più semplice e affidabile consiste nel trasformare l'intera query per il valore N-esimo più alto in una sottoquery scalare all'interno di una singola SELECT. Una sottoquery scalare che non trova righe viene valutata come NULL e la SELECT esterna produce sempre esattamente una riga.
Questa è la risposta canonica alla variante «restituire NULL» tipica di LeetCode e funziona in ogni dialetto.
SELECT (
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2 -- N = 3
) AS third_highest;Perché funziona il trucco della sottoquery scalare
Due regole si combinano per produrre il comportamento desiderato:
- Una sottoquery scalare deve restituire al massimo un valore. Se non restituisce righe, SQL inserisce
NULL. - La SELECT esterna senza
FROM, oppure con una sorgente di una sola riga, restituisce sempre esattamente una riga.
Quindi, quando la query interna trova il valore N-esimo, lo si ottiene; quando non trova nulla, si ottiene una riga contenente NULL. È esattamente il comportamento richiesto dall'intervistatore.
Correzione 1 con la versione DENSE_RANK
Lo stesso involucro funziona anche con la soluzione basata sulle funzioni finestra. Inserisca la query con il ranking nella sottoquery scalare; se nessuna riga ha il ranking N, la sottoquery restituisce NULL e la SELECT esterna restituisce comunque una riga.
SELECT (
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = 3
) AS third_highest;Correzione 2: MAX restituisce NULL automaticamente
Ricordi l'idea del doppio MAX della prima lezione. Un'aggregazione su zero righe restituisce NULL e produce comunque una riga. Per il secondo valore più alto, questa è una soluzione compatta che soddisfa già il requisito di restituire NULL.
Il limite è che estendere il puro annidamento di MAX a un N arbitrario diventa poco elegante; perciò questa soluzione è indicata soprattutto per il caso del secondo valore più alto.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);Correzione 3: COALESCE con un valore predefinito
Se il suo ambiente garantisce la presenza di una riga, ma il valore potrebbe mancare per qualche altro motivo, può racchiudere il risultato in COALESCE per fornire un valore predefinito esplicito.
Nota: COALESCE è utile solo quando una riga esiste già. Non trasforma un insieme di risultati vuoto in una riga. Quindi lo combini con l'involucro della sottoquery scalare, che garantisce una riga, e poi applichi COALESCE al valore se desidera qualcosa di diverso da NULL, ad esempio 0.
SELECT COALESCE((
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2
), 0) AS third_highest_or_zero;Cosa non risolve il problema
Faccia attenzione alle correzioni che sembrano corrette ma non funzionano:
- Aggiungere
COALESCEdirettamente intorno a una query che restituisce zero righe non serve a nulla: non esiste alcuna riga su cuiCOALESCEpossa operare. IFNULLeISNULLhanno la stessa limitazione diCOALESCE.- Aggiungere
LIMIT 1non crea una riga quando nessuna riga soddisfa i criteri.
Il problema del numero di righe deve essere risolto con l'involucro della sottoquery scalare o con un'aggregazione, non con le sole funzioni di sostituzione di NULL.
Esempio svolto: chiedere il terzo di due valori
Stipendi: 500, 500, 300. Gli stipendi distinti sono solo 500 e 300, quindi non esiste un terzo stipendio più alto.
- DENSE_RANK semplice con WHERE rnk = 3: restituisce zero righe. Non soddisfa la specifica.
- Involucro con sottoquery scalare: la query interna non trova nulla, quindi la SELECT esterna restituisce una riga:
NULL. Soddisfa la specifica. - COALESCE(..., 0): restituisce una riga:
0, se è stato richiesto un valore numerico predefinito.
Spiegarlo durante il colloquio
Ottenga punti spiegando il ragionamento:
- «La query ingenua restituisce un insieme vuoto, non NULL, quindi la racchiuderò in una sottoquery scalare per garantire una riga.»
- «Una sottoquery scalare senza righe corrispondenti viene valutata come NULL, che è esattamente il comportamento richiesto.»
- «Se preferisce un valore predefinito come 0 invece di NULL, aggiungerò COALESCE intorno alla sottoquery.»
Il punto centrale della domanda è dimostrare di comprendere la differenza tra il numero di righe e la semantica dei valori.
Mettere tutto insieme
Una soluzione robusta e parametrizzabile per ottenere il valore N-esimo più alto oppure NULL consiste nel classificare gli stipendi distinti, filtrare il ranking N all'interno di una sottoquery scalare e lasciare che la SELECT esterna garantisca una sola riga.
Questa query gestisce i duplicati tramite DENSE_RANK, si generalizza a qualsiasi N e restituisce NULL in modo sicuro quando N supera il numero di stipendi distinti.
SELECT (
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = :n
LIMIT 1
) AS nth_highest;Verifica rapida
Ragioni sulla differenza tra il numero di righe e i valori NULL.
Riepilogo
Quando N supera il numero di stipendi distinti disponibili, una query di ranking semplice restituisce un insieme vuoto, non NULL.
- Racchiuda la query per il valore N-esimo più alto in una sottoquery scalare all'interno di una SELECT esterna, così produrrà sempre una riga, con valore
NULLquando non esiste alcuna corrispondenza. - La forma con il doppio MAX restituisce automaticamente
NULLnel caso del secondo valore più alto. - COALESCE sostituisce un valore solo quando una riga esiste già; non può trasformare zero righe in una riga.
Quando l'intervistatore chiede di gestire elegantemente i valori NULL, distingua sempre il numero di righe dal valore.
Domande Frequenti
La lezione «Restituire NULL quando non esiste l'ennesimo valore» è gratuita?
Sì — il testo completo di «Restituire NULL quando non esiste l'ennesimo valore» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.
Cosa imparerò in «Restituire NULL quando non esiste l'ennesimo valore»?
Il caso limite preferito nei colloqui: gestire correttamente un numero insufficiente di righe Eserciti Coding Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Coding Interview Prep?
Non è richiesta alcuna esperienza precedente. Coding Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Restituire NULL quando non esiste l'ennesimo valore»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Coding Interview Prep?
Sì. Ogni lezione Coding Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Il secondo stipendio più alto: cinque metodi
- L'ennesimo valore più alto con DENSE_RANK
- Il reddito più alto per reparto
- Restituire NULL quando non esiste l'ennesimo valore