Returnera NULL när inget n:te värde finns
Fallgropen intervjuare älskar: hantera för få rader på ett elegant sätt
Returnera NULL när inget n:te värde finns är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Specialfallet som intervjuare älskar
När ni har löst frågan om det N:e högsta värdet lägger intervjuaren till: "Vad händer om tabellen innehåller färre än N distinkta löner? Jag vill ha ett enda NULL, inte ett tomt resultat."
Detta är frågan som skiljer kandidater som har memorerat en fråga från dem som förstår hur resultatuppsättningar fungerar. Många lösningar returnerar i tysthet noll rader i stället för en rad som innehåller NULL.
Den här lektionen handlar om att tvinga fram exakt en resultatrad vars värde är NULL när det inte finns något N:e värde.
Varför DENSE_RANK ensam inte returnerar några rader
Kom ihåg standardfrågan för det N:e högsta värdet. Om det bara finns två distinkta löner och ni frågar efter den tredje, matchar WHERE rnk = 3 inget och frågan returnerar en tom resultatuppsättning: noll rader.
En tom resultatuppsättning är inte samma sak som en rad som innehåller NULL. Om kravet säger "returnera NULL" klarar ett tomt resultat inte testet, även om den underliggande logiken är korrekt.
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 salariesLösning 1: kapsla in frågan i en yttre SELECT
Den enklaste tillförlitliga lösningen är att göra hela frågan om det N:e högsta värdet till en skalär underfråga i en enda SELECT. En skalär underfråga som inte matchar några rader utvärderas till NULL, och den yttre SELECT producerar alltid exakt en rad.
Detta är standardsvaret på LeetCode-varianten där "NULL" ska returneras och fungerar i alla dialekter.
SELECT (
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2 -- N = 3
) AS third_highest;Varför tricket med den skalära underfrågan fungerar
Två regler samverkar och ger det önskade beteendet:
- En skalär underfråga måste returnera högst ett värde. Om den inte returnerar några rader ersätter SQL resultatet med
NULL. - En yttre SELECT utan
FROM(eller med en källa som innehåller en enda rad) returnerar alltid exakt en rad.
När den inre frågan hittar det N:e värdet får ni alltså det värdet; när den inte hittar något får ni en rad som innehåller NULL. Det är precis det krav intervjuaren angav.
Lösning 1 med DENSE_RANK-versionen
Samma omslutning fungerar även för lösningen med fönsterfunktion. Placera den rangordnade frågan i den skalära underfrågan. Om ingen rad har rang N ger underfrågan NULL, och den yttre SELECT returnerar fortfarande en rad.
SELECT (
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = 3
) AS third_highest;Lösning 2: MAX returnerar NULL utan extra arbete
Kom ihåg idén med MAX-under-MAX från lektion 1. Ett aggregat över noll rader returnerar NULL och producerar ändå en rad. För det näst högsta värdet är detta en tydlig lösning på en rad som redan uppfyller NULL-kravet.
Nackdelen är att det blir snabbt klumpigt att bygga ut ren MAX-nästling till ett godtyckligt N, så detta passar bäst specifikt för det näst högsta värdet.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);Lösning 3: COALESCE med ett reservvärde
Om miljön garanterar en rad men värdet kan saknas av något annat skäl kan resultatet omslutas av COALESCE för att ange ett uttryckligt standardvärde.
Observera att COALESCE bara hjälper när en rad redan finns. Den omvandlar inte en tom resultatuppsättning till en rad. Kombinera den därför med den skalära underfrågan, som garanterar en rad, och använd sedan COALESCE på värdet om ni vill ha något annat än NULL, till exempel 0.
SELECT COALESCE((
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2
), 0) AS third_highest_or_zero;Det som INTE löser problemet
Se upp med lösningar som ser rätt ut men ändå misslyckas:
- Att lägga till
COALESCEdirekt runt en fråga som returnerar noll rader gör ingenting; det finns ingen rad somCOALESCEkan behandla. IFNULLochISNULLhar samma begränsning somCOALESCE.- Att lägga till
LIMIT 1skapar inte en rad när ingen rad uppfyller villkoren.
Problemet med radantalet måste lösas med den skalära underfrågan eller ett aggregat, inte enbart med NULL-ersättningsfunktioner.
Genomgång av exempel: fråga efter det tredje av två
Löner: 500, 500, 300. De distinkta lönerna är bara 500 och 300, så det finns inget tredje högsta värde.
- Vanlig DENSE_RANK med WHERE rnk = 3: returnerar noll rader. Kravet uppfylls inte.
- Omslutning med en skalär underfråga: den inre frågan hittar inget, så den yttre SELECT returnerar en rad:
NULL. Kravet uppfylls. - COALESCE(..., 0): returnerar en rad:
0, om ett numeriskt standardvärde har efterfrågats.
Så förklarar man det under intervjun
Samla poäng genom att förklara:
- "Den naiva frågan returnerar en tom resultatuppsättning, inte NULL, så jag kapslar in den i en skalär underfråga för att garantera en rad."
- "En skalär underfråga utan matchande rader utvärderas till NULL, vilket är precis det angivna kravet."
- "Om ni föredrar ett standardvärde som 0 i stället för NULL lägger jag till COALESCE runt underfrågan."
Hela poängen med frågan är att visa att ni förstår skillnaden mellan semantiken för radantal och värden.
Sätt ihop allt
En robust och parametriserbar lösning för det N:e högsta värdet eller NULL är att rangordna distinkta löner, filtrera på rang N i en skalär underfråga och låta den yttre SELECT garantera en enda rad.
Den här frågan hanterar dubbletter (med DENSE_RANK), kan generaliseras till vilket N som helst och returnerar NULL på ett korrekt sätt när N är större än antalet distinkta löner.
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;Snabbkontroll
Resonera kring radantal i förhållande till NULL-värden.
Sammanfattning
När N är större än antalet tillgängliga distinkta löner returnerar en vanlig rangordningsfråga en tom resultatuppsättning, inte NULL.
- Kapsla in frågan om det N:e högsta värdet i en skalär underfråga i en yttre SELECT, så att den alltid producerar en rad och ger
NULLnär inget värde matchar. - Varianten MAX-under-MAX returnerar
NULLutan extra arbete i fallet med det näst högsta värdet. - COALESCE ersätter bara ett värde när en rad redan finns; den kan inte omvandla noll rader till en rad.
Skilj alltid mellan radantal och värde när en intervjuare frågar om NULL-hantering vid saknade resultat.
Lär dig Förberedelse inför kodningsintervjuer med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 90
- Lektioner
- 360
Vanliga frågor
Är lektionen ”Returnera NULL när inget n:te värde finns” gratis?
Ja – hela texten till ”Returnera NULL när inget n:te värde finns” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Vad lär jag mig i ”Returnera NULL när inget n:te värde finns”?
Fallgropen intervjuare älskar: hantera för få rader på ett elegant sätt Ni övar på Förberedelse inför kodningsintervjuer med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelse inför kodningsintervjuer?
Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Returnera NULL när inget n:te värde finns”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelse inför kodningsintervjuer-lektionen?
Ja. Varje Förberedelse inför kodningsintervjuer-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Näst högsta lönen på fem sätt
- Det n:te högsta värdet med DENSE_RANK
- Högst avlönad per avdelning
- Returnera NULL när inget n:te värde finns