Forberedelse til kodeintervjuer · leksjon

Returnere NULL når den n-te verdien ikke finnes

Lær å håndtere grensetilfellet intervjuere elsker: for få rader.

Leksjon 4 av 413 trinn

Returnere NULL når den n-te verdien ikke finnes er en gratis leksjon i Forberedelse til kodeintervjuer på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til kodeintervjuer, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.

Grensetilfellet intervjuere elsker

Etter at du har løst spørringen for den N-te høyeste verdien, legger intervjueren til: «Hva om tabellen har færre enn N ulike lønninger? Jeg vil ha én enkelt NULL, ikke et tomt resultat.»

Dette er spørsmålet som skiller kandidater som har pugget en spørring, fra dem som forstår hvordan resultatsett fungerer. Mange løsninger returnerer i stillhet null rader i stedet for én rad som inneholder NULL.

Denne leksjonen handler om å tvinge frem nøyaktig én rad i resultatet, med verdien NULL når den N-te verdien ikke finnes.

Hvorfor DENSE_RANK alene ikke returnerer noen rader

Husk standardspørringen for den N-te høyeste verdien. Hvis det bare finnes to ulike lønninger og du spør etter den tredje, finner WHERE rnk = 3 ingen treff. Spørringen returnerer derfor et tomt sett: null rader.

Et tomt sett er ikke det samme som en rad som inneholder NULL. Hvis spesifikasjonen sier «returner NULL», består ikke en tom resultatmengde testen, selv om den underliggende logikken er riktig.

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: pakk inn i en ytre SELECT

Den enkleste pålitelige løsningen er å gjøre hele spørringen for den N-te høyeste verdien til en skalarunderspørring inne i én enkelt SELECT. En skalarunderspørring som ikke finner noen rader, evalueres til NULL, og den ytre SELECT-en produserer alltid nøyaktig én rad.

Dette er standardsvaret på LeetCode-varianten «returner NULL», og det fungerer i alle SQL-dialekter.

SELECT (
  SELECT DISTINCT salary
  FROM employee
  ORDER BY salary DESC
  LIMIT 1 OFFSET 2   -- N = 3
) AS third_highest;

Hvorfor trikset med skalarunderspørringen fungerer

To regler kombineres for å gi ønsket oppførsel:

  • En skalarunderspørring kan returnere høyst én verdi. Hvis den ikke returnerer noen rader, setter SQL inn NULL.
  • En ytre SELECT uten FROM (eller med en kilde som inneholder én rad) avgir alltid nøyaktig én rad.

Når den indre spørringen finner den N-te verdien, får du den. Når den ikke finner noe, får du én rad som inneholder NULL. Det er nøyaktig det intervjueren ba om.

Løsning 1 med DENSE_RANK-versjonen

Den samme innpakningen fungerer også rundt løsningen med vindusfunksjon. Plasser den rangerte spørringen inne i skalarunderspørringen. Hvis ingen rad har rang N, gir underspørringen NULL, mens den ytre SELECT-en fortsatt returnerer én 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 returnerer NULL automatisk

Husk MAX-under-MAX-ideen fra leksjon 1. Et aggregat over null rader returnerer NULL og produserer likevel én rad. For den nest høyeste verdien er dette en ryddig énlإinjer som allerede oppfyller NULL-kravet.

Ulempen er at ren nøsting av MAX blir lite elegant når den skal utvides til en vilkårlig N, så dette passer best spesifikt for den nest høyeste verdien.

SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);

Løsning 3: COALESCE med en reserveverdi

Hvis miljøet ditt garanterer én rad, men verdien kan mangle av en annen grunn, kan du pakke resultatet inn i COALESCE for å angi en uttrykkelig standardverdi.

Merk: COALESCE hjelper bare når en rad allerede finnes. Den gjør ikke et tomt resultatsett om til en rad. Kombiner den derfor med innpakningen med skalarunderspørring (som garanterer en rad), og bruk deretter COALESCE på verdien hvis du ønsker noe annet enn NULL, for eksempel 0.

SELECT COALESCE((
  SELECT DISTINCT salary
  FROM employee
  ORDER BY salary DESC
  LIMIT 1 OFFSET 2
), 0) AS third_highest_or_zero;

Hva løser IKKE problemet

Vær oppmerksom på løsninger som ser riktige ut, men ikke fungerer:

  • Å legge COALESCE direkte rundt en spørring som returnerer null rader, gjør ingenting. Det finnes ingen rad som COALESCE kan virke på.
  • IFNULL og ISNULL har den samme begrensningen som COALESCE.
  • Å legge til LIMIT 1 oppretter ikke en rad når ingen rader oppfyller kravet.

Problemet med radantallet må løses med skalarunderspørringen eller et aggregat, ikke bare med funksjoner som erstatter NULL-verdier.

Gjennomgått eksempel: når du spør etter den tredje av to

Lønninger: 500, 500, 300. Det finnes bare to ulike lønninger, 500 og 300, så den tredje høyeste finnes ikke.

  • Vanlig DENSE_RANK med WHERE rnk = 3: returnerer null rader. Oppfyller ikke spesifikasjonen.
  • Innpakning med skalarunderspørring: Den indre spørringen finner ingenting, så den ytre SELECT-en returnerer én rad: NULL. Oppfyller spesifikasjonen.
  • COALESCE(..., 0): returnerer én rad: 0, hvis det ble bedt om en numerisk standardverdi.

Slik forklarer du det i intervjuet

Vis hva du kan ved å forklare:

  • «Den naive spørringen returnerer et tomt sett, ikke NULL, så jeg pakker den inn i en skalarunderspørring for å garantere én rad.»
  • «En skalarunderspørring uten treff evalueres til NULL, som er nøyaktig det kravet sier.»
  • «Hvis du heller ønsker en standardverdi som 0 enn NULL, legger jeg til COALESCE rundt underspørringen.»

Hele poenget med spørsmålet er å vise at du forstår forskjellen mellom radantall og den returnerte verdien.

Sett alt sammen

En robust og parametriserbar løsning som returnerer den N-te høyeste verdien eller NULL, er å rangere ulike lønninger, filtrere på rang N inne i en skalarunderspørring og la den ytre SELECT-en garantere én enkelt rad.

Denne ene spørringen håndterer duplikater (via DENSE_RANK), kan generaliseres til enhver N og returnerer NULL på en ryddig måte når N er større enn antallet ulike lønninger.

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;

Hurtigsjekk

Resonner om forskjellen mellom radantall og NULL-verdier.

Oppsummering

Når N er større enn antallet tilgjengelige ulike lønninger, returnerer en vanlig rangeringsspørring et tomt sett, ikke NULL.

  • Pakk spørringen for den N-te høyeste verdien inn i en skalarunderspørring i en ytre SELECT, slik at den alltid produserer én rad og gir NULL når ingen verdi passer.
  • Varianten med MAX-under-MAX returnerer NULL automatisk i tilfellet med den nest høyeste verdien.
  • COALESCE erstatter bare en verdi når en rad allerede finnes. Den kan ikke gjøre null rader om til én.

Skill alltid mellom radantall og verdi når intervjueren ber om god håndtering av NULL.

Gratis å komme i gang

Lær deg Forberedelse til kodeintervjuer med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
90
Leksjoner
360

Ofte stilte spørsmål

Er leksjonen «Returnere NULL når den n-te verdien ikke finnes» gratis?

Ja – hele teksten i «Returnere NULL når den n-te verdien ikke finnes» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til kodeintervjuer-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.

Hva lærer jeg i «Returnere NULL når den n-te verdien ikke finnes»?

Lær å håndtere grensetilfellet intervjuere elsker: for få rader. Du øver på Forberedelse til kodeintervjuer med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Forberedelse til kodeintervjuer?

Ingen tidligere erfaring er nødvendig. Forberedelse til kodeintervjuer på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Returnere NULL når den n-te verdien ikke finnes»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Forberedelse til kodeintervjuer-leksjonen?

Ja. Alle Forberedelse til kodeintervjuer-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Nest høyeste lønn – fem metoder
  2. Den n-te høyeste verdien med DENSE_RANK
  3. Den best betalte i hver avdeling
  4. Returnere NULL når den n-te verdien ikke finnes
← Tilbake til Forberedelse til kodeintervjuer