CASE-uttrykket
HVIS/SÅ-logikk inne i en spørring.
CASE-uttrykket er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 1 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 SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Forgrenet logikk i SQL
Noen ganger trenger du at en spørring tar en beslutning: hvis dette, så det, ellers noe annet. SQL gir deg CASE-uttrykket for akkurat dette.
CASE lar deg returnere ulike verdier basert på betingelser, direkte i en SELECT. Tenk på det som SQL-versjonen av en if/else-kjede.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;Oppbygningen av en CASE
Et CASE-uttrykk består av noen deler:
WHEN condition THEN value— én eller flere grenerELSE value— en valgfri reserveverdiEND— avslutter uttrykket (obligatorisk!)
SQL evaluerer WHEN-grenene ovenfra og ned og returnerer verdien til den første som er sann.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE returnerer en verdi
Hovedideen er at et CASE-uttrykk evalueres til én verdi per rad. Siden det produserer en verdi, kan du bruke det overalt der en verdi er tillatt — i SELECT-listen, i WHERE, i ORDER BY og til og med inne i funksjoner.
Her merker det hver bestilling med 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;Første treff vinner
Rekkefølgen er viktig. SQL kontrollerer hver WHEN i rekkefølge og stopper ved den første som er sann. Senere grener ignoreres selv om de også ville blitt oppfylt.
Nedenfor blir en bestilling over 1000 'large', aldri 'medium', fordi den første grenen som stemmer, vinner.
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 fungerer som en oppsamlingsgren. Hvis ingen av WHEN-betingelsene er sanne, returnerer CASE verdien i ELSE.
Hvis du utelater ELSE og ingenting stemmer, returnerer CASE NULL. Dette er en vanlig kilde til overraskende NULL-verdier, så legg til en eksplisitt ELSE når du ønsker en definert reserveverdi.
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 hva som helst
En WHEN-betingelse er bare et boolsk uttrykk — av samme type som du skriver i en WHERE-klausul. Du kan bruke sammenligninger, AND, OR, BETWEEN, IN, LIKE og mer.
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;Resultattypene må være kompatible
Hver gren i en CASE må returnere verdier med en kompatibel type, fordi kolonnen må ha én type. Blanding av tekst og tall vil føre til en feil eller uventet typekonvertering.
Hvis du trenger tall i én gren og tekst i en annen, må du caste eksplisitt slik at typene 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;Bruke CASE i WHERE
Siden CASE produserer en verdi, kan du sammenligne resultatet i en WHERE-klausul. Dette er nyttig for dynamiske filtreringsregler.
Ofte er likevel vanlig boolsk logikk i WHERE tydeligere — bruk CASE i WHERE bare når forgreningen faktisk gjør betingelsen enklere.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;Nesting av CASE
Du kan plassere et CASE-uttrykk inne i en annen CASE-gren for å uttrykke lagdelt logikk. Dette fungerer, men dypt nestede uttrykk blir vanskelige å lese.
Hold nestingen grunn; hvis den vokser, er en separat kolonne eller en oppslagstabell vanligvis ryddigere.
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 kraftig mønster er å legge et CASE-uttrykk inn i et aggregat som SUM eller COUNT. Da teller eller summerer du rader betinget i én gjennomkjøring — dette kalles noen ganger betinget aggregering eller en pivot.
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 som returnerer NULL med vilje
Å returnere NULL fra en gren er noen ganger akkurat det du ønsker — for eksempel for å skjule en verdi du ikke vil vise, eller for å sende den videre til et aggregat som ignorerer NULL-verdier.
Her beholder bare store bestillinger totalbeløpet sitt; andre blir NULL, slik at AVG ville hoppet over dem.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;Hurtigsjekk
Vurder dette uttrykket for en rad der total = 1500:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
Hvilken verdi returnerer det?
Oppsummering: CASE-uttrykket
Du har lært grunnprinsippene i betinget logikk i SQL:
CASE WHEN ... THEN ... ELSE ... ENDreturnerer én verdi per rad- Grenene evalueres ovenfra og ned; første treff vinner
- Hvis
ELSEutelates, blir resultatetNULLnår ingenting samsvarer - Alle grener må returnere kompatible datatyper
CASEfungerer iSELECT,WHEREog inne i aggregatfunksjoner
Deretter sammenligner vi de to syntaktiske formene av CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;Lær deg SQL 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
- 46
- Leksjoner
- 183
Ofte stilte spørsmål
Er leksjonen «CASE-uttrykket» gratis?
Ja – hele teksten i «CASE-uttrykket» 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 SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «CASE-uttrykket»?
HVIS/SÅ-logikk inne i en spørring. Du øver på SQL Academy 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 SQL Academy?
Ingen tidligere erfaring er nødvendig. SQL Academy 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 1 av 4.
Hvor lang tid tar leksjonen «CASE-uttrykket»?
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 SQL Academy-leksjonen?
Ja. Alle SQL Academy-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.