Förberedelse inför kodningsintervjuer · Lektion

Returnera NULL när inget n:te värde finns

Fallgropen intervjuare älskar: hantera för få rader på ett elegant sätt

Lektion 4 av 413 steg

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 salaries

Lö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 COALESCE direkt runt en fråga som returnerar noll rader gör ingenting; det finns ingen rad som COALESCE kan behandla.
  • IFNULL och ISNULL har samma begränsning som COALESCE.
  • Att lägga till LIMIT 1 skapar 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 NULL när inget värde matchar.
  • Varianten MAX-under-MAX returnerar NULL utan 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.

Gratis att börja

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

  1. Näst högsta lönen på fem sätt
  2. Det n:te högsta värdet med DENSE_RANK
  3. Högst avlönad per avdelning
  4. Returnera NULL när inget n:te värde finns
← Tillbaka till Förberedelse inför kodningsintervjuer