SQL Academy · leksjon

CASE-uttrykket

HVIS/SÅ-logikk inne i en spørring.

Leksjon 1 av 413 trinn

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 grener
  • ELSE value — en valgfri reserveverdi
  • END — 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
END

CASE 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 ... END returnerer én verdi per rad
  • Grenene evalueres ovenfra og ned; første treff vinner
  • Hvis ELSE utelates, blir resultatet NULL når ingenting samsvarer
  • Alle grener må returnere kompatible datatyper
  • CASE fungerer i SELECT, WHERE og 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;
Gratis å komme i gang

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.

Alle leksjonene i dette kurset

  1. CASE-uttrykket
  2. Søkt kontra enkel CASE
  3. Gruppere og merke data
  4. CASE i ORDER BY og aggregater
← Tilbake til SQL Academy