CASE-udtrykket
IF/THEN-logik inde i en forespørgsel.
CASE-udtrykket er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.
Forgreningslogik i SQL
Nogle gange skal en forespørgsel træffe en beslutning: hvis dette, så det, ellers noget andet. SQL giver dig CASE-udtrykket til netop dette.
CASE lader dig returnere forskellige værdier baseret på betingelser, direkte i en SELECT. Tænk på det som SQL's version af en if/else-kæde.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;Opbygningen af CASE
Et CASE-udtryk består af nogle få dele:
WHEN condition THEN value— en eller flere greneELSE value— en valgfri reserveværdiEND— afslutter udtrykket (påkrævet!)
SQL evaluerer WHEN-grenene fra top til bund og returnerer værdien fra den første gren, der er sand.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE returnerer en værdi
Hovedideen er, at et CASE-udtryk evalueres til én værdi pr. række. Fordi det producerer en værdi, kan du bruge det overalt, hvor en værdi er tilladt — i SELECT-listen, i WHERE, i ORDER BY og endda inde i funktioner.
Her tildeler det hver ordre en enkel status.
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;Den første matchende gren vinder
Rækkefølgen er vigtig. SQL kontrollerer hver WHEN i rækkefølge og stopper ved den første, der er sand. Senere grene ignoreres, selv hvis de også ville passe.
Nedenfor er en ordre på over 1000 'stor', aldrig 'mellemstor', fordi den første matchende gren vinder.
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;ELSE-grenen
ELSE-grenen er opsamlingsgrenen. Hvis ingen af WHEN-betingelserne er sande, returnerer CASE værdien fra ELSE.
Hvis du udelader ELSE, og intet matcher, returnerer CASE NULL. Det er en almindelig kilde til uventede NULL-værdier, så tilføj en eksplicit ELSE, når du vil have en defineret reserveværdi.
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)Betingelser kan være hvad som helst
En WHEN-betingelse er blot et boolesk udtryk — af samme type som det, du skriver i en WHERE-klausul. Du kan bruge sammenligninger, AND, OR, BETWEEN, IN, LIKE og meget mere.
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;Resultattyper skal være kompatible
Alle grene i et CASE-udtryk skal returnere værdier af en kompatibel type, fordi kolonnen skal have én type. Hvis du blander tekst og tal, kan det medføre en fejl eller en uventet typekonvertering.
Hvis du har brug for tal i én gren og tekst i en anden, skal du typekonvertere eksplicit, så typerne stemmer overens.
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;Brug af CASE i WHERE
Fordi CASE producerer en værdi, kan du sammenligne resultatet i en WHERE-klausul. Det er praktisk til dynamiske filtreringsregler.
Ofte er almindelig boolesk logik i WHERE dog tydeligere — brug kun CASE i WHERE, når forgreningen reelt gør betingelsen enklere.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;Indlejring af CASE
Du kan placere et CASE-udtryk i en anden CASE-gren for at udtrykke lagdelt logik. Det fungerer, men dybt indlejrede udtryk bliver svære at læse.
Hold indlejringen på et lavt niveau; hvis den vokser, er en separat kolonne eller en opslagstabel normalt mere overskuelig.
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;CASE med aggregater
Et kraftfuldt mønster er at indlejre et CASE-udtryk i et aggregat som SUM eller COUNT. Det tæller eller summerer rækker betinget i én gennemgang — det kaldes nogle gange betinget aggregering eller en pivotering.
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;CASE returnerer NULL med vilje
At returnere NULL fra en gren er nogle gange præcis det, du har brug for — for eksempel for at gøre en værdi tom, hvis du ikke vil vise den, eller for at sende den videre til et senere aggregat, der ignorerer NULL-værdier.
Her beholder kun store ordrer deres totalbeløb; de øvrige bliver til NULL, så AVG springer dem over.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;Hurtig kontrol
Overvej dette udtryk for en række, hvor total = 1500:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
Hvilken værdi returnerer det?
Opsummering: CASE-udtrykket
Du har lært det grundlæggende i betinget logik i SQL:
CASE WHEN ... THEN ... ELSE ... ENDreturnerer én værdi pr. række- Grenene kontrolleres fra top til bund; første match vinder
- Hvis
ELSEudelades, giver detNULL, når intet matcher - Alle grene skal returnere kompatible typer
CASEfungerer iSELECT,WHEREog inde i aggregater
Næste gang sammenligner vi de to syntaktiske former af CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;Lær SQL med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 46
- Lektioner
- 183
Ofte stillede spørgsmål
Er lektionen “CASE-udtrykket” gratis?
Ja — hele teksten til “CASE-udtrykket” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “CASE-udtrykket”?
IF/THEN-logik inde i en forespørgsel. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på SQL Academy?
Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “CASE-udtrykket”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne SQL Academy-lektion?
Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- CASE-udtrykket
- Searched kontra simple CASE
- Gruppering og mærkning af data
- CASE i ORDER BY og aggregater