- Funkcija CASE u MySQL-u omogućuje vam izvođenje uvjetnih evaluacija i vraćanje prilagođenih rezultata.
- Više uvjeta može se koristiti s WHEN klauzulom, a null vrijednosti mogu se obraditi s ELSE.
- CASE se može kombinirati s funkcijama agregacije za optimizaciju upita.
- Slijeđenje najboljih praksi pri korištenju CASE-a ključno je za održavanje performansi i čitljivosti koda.
Funkcija CASE u MySQL-u moćan je alat koji vam omogućuje izvođenje uvjetnih operacija unutar vaših upita. Pomoću CASE možete procijeniti različite uvjete i vratiti specifične rezultate ovisno o tome jesu li ti uvjeti ispunjeni ili ne. Objasnit ćemo ovu funkciju praktičnim primjerima koji će vam pomoći da svladate korištenje CASE-a u MySQL-u i poboljšate svoje vještine upravljanja bazom podataka.
Što je funkcija CASE u MySQL-u?
Funkcija CASE u MySQL- u je uvjetni izraz koji vam omogućuje procjenu različitih uvjeta i vraćanje određenih rezultata ovisno o tome jesu li ti uvjeti ispunjeni. To je vrlo koristan alat za izvođenje logičkih operacija unutar vaših upita i dobivanje prilagođenih rezultata na temelju određenih kriterija.
CASE radi slično nizu izjava IF-THEN-ELSE, gdje možete navesti više uvjeta i vrijednosti koje treba vratiti kada se ti uvjeti ispune. Ako niti jedan od uvjeta nije ispunjen, možete definirati zadanu vrijednost pomoću klauzule ELSE.
Osnovna CASE sintaksa u MySQL-u
Osnovna sintaksa funkcije CASE u MySQL-u je sljedeća:
CASE
WHEN condición1 THEN resultado1
WHEN condición2 THEN resultado2
...
WHEN condiciónN THEN resultadoN
ELSE resultado_predeterminado
END
Evo objašnjenja svakog dijela sintakse:
WHEN: Određuje uvjet koji treba procijeniti.THEN: Označava rezultat koji će biti vraćen ako je odgovarajući uvjet ispunjen.ELSE: (Izborno) Određuje rezultat koji se vraća ako nijedan od gornjih uvjeta nije ispunjen.END: Označava kraj CASE izraza.
Sada kada znate osnovnu sintaksu, istražimo neke praktične primjere!
Primjer 1: Klasificirajte učenike prema njihovom prosjeku
Pretpostavimo da imate tablicu pod nazivom "students" sa sljedećim stupcima: "id", "name" i "avg". Želite rangirati učenike prema njihovom GPA-u pomoću funkcije CASE. Možete to učiniti na sljedeći način:
SELECT nombre,
CASE
WHEN promedio >= 90 THEN 'Sobresaliente'
WHEN promedio >= 80 THEN 'Notable'
WHEN promedio >= 70 THEN 'Bien'
WHEN promedio >= 60 THEN 'Suficiente'
ELSE 'Insuficiente'
END AS clasificacion
FROM estudiantes;
U ovom primjeru koristimo CASE za procjenu prosjeka svakog učenika i dodjeljivanje odgovarajućeg ranga. Ako je prosjek veći ili jednak 90, klasificira se kao "Izvanredan". Ako je između 80 i 89, klasificiran je kao "Izvanredan" i tako dalje. Ako je prosjek manji od 60, klasificira se kao "Nedovoljan".
Primjer 2: Dodjeljivanje kategorija proizvoda
Zamislite da imate tablicu pod nazivom "proizvodi" sa stupcima "id", "ime" i "cijena". Svakom proizvodu želite dodijeliti kategoriju na temelju njegove cijene pomoću funkcije CASE. Možete to učiniti na sljedeći način:
SELECT nombre,
CASE
WHEN precio > 1000 THEN 'Premium'
WHEN precio > 500 THEN 'Gama alta'
WHEN precio > 100 THEN 'Gama media'
ELSE 'Económico'
END AS categoria
FROM productos;
U ovom primjeru koristimo CASE za procjenu cijene svakog proizvoda i dodjeljivanje odgovarajuće kategorije. Ako je cijena veća od 1000, klasificira se kao "Premium". Ako je između 500 i 1000, klasificira se kao "High-End", i tako dalje. Ako je cijena manja ili jednaka 100, klasificirana je kao "Ekonomična".
Primjer 3: Izračunajte popuste na temelju kupljene količine
Pretpostavimo da imate tablicu pod nazivom "prodaja" sa stupcima "id", "product" i "quantity". Želite izračunati popust koji se primjenjuje na svaku prodaju na temelju količine kupljene pomoću funkcije CASE. Možete to učiniti na sljedeći način:
SELECT producto,
CASE
WHEN cantidad >= 100 THEN 0.20
WHEN cantidad >= 50 THEN 0.15
WHEN cantidad >= 20 THEN 0.10
ELSE 0
END AS descuento
FROM ventas;
U ovom primjeru koristimo CASE za procjenu kupljene količine svakog proizvoda i izračunavanje odgovarajućeg popusta. Ukoliko je količina veća ili jednaka 100, primjenjuje se popust od 20%. Ako je između 50 i 99, primjenjuje se popust od 15% i tako dalje. Ukoliko je količina manja od 20 komada, popust se ne primjenjuje.
Primjer 4: Pretvaranje numeričkih vrijednosti u raspone
Zamislite da imate tablicu pod nazivom "zaposlenici" sa stupcima "id", "ime" i "dob". Želite pretvoriti dob zaposlenika u raspone pomoću funkcije CASE. Možete to učiniti na sljedeći način:
SELECT nombre,
CASE
WHEN edad >= 60 THEN 'Senior'
WHEN edad >= 40 THEN 'Mediana edad'
WHEN edad >= 20 THEN 'Joven'
ELSE 'Menor de edad'
END AS rango_edad
FROM empleados;
U ovom primjeru koristimo CASE za procjenu dobi svakog zaposlenika i dodjeljivanje odgovarajućeg raspona. Ako je dob veća ili jednaka 60, klasificira se kao "Stariji". Ako imate između 40 i 59 godina, klasificirani ste kao "sredovječni" i tako dalje. Ako je dob manja od 20 godina, klasificira se kao "Maloljetnik".
Primjer 5: Dodjeljivanje oznaka na temelju više uvjeta
Pretpostavimo da imate tablicu pod nazivom "narudžbe" sa stupcima "id", "kupac", "ukupno" i "status". Želite dodijeliti oznake svakoj narudžbi na temelju njenog ukupnog iznosa i statusa pomoću funkcije CASE s više uvjeta. Možete to učiniti na sljedeći način:
SELECT cliente,
CASE
WHEN total > 1000 AND estado = 'Entregado' THEN 'VIP'
WHEN total > 500 AND estado = 'Entregado' THEN 'Prioritario'
WHEN estado = 'Pendiente' THEN 'En proceso'
ELSE 'Regular'
END AS etiqueta
FROM pedidos;
U ovom primjeru koristimo CASE s više uvjeta za procjenu ukupnog iznosa i statusa svake narudžbe i dodjeljivanje odgovarajuće oznake. Ako je zbroj veći od 1000 i status je "Isporučeno", označen je kao "VIP". Ako je ukupni broj veći od 500, a status je "Isporučeno", označava se kao "Prioritetno". Ako je status "Na čekanju", označen je kao "U procesu". Inače je označeno kao "Regular".
Primjer 6: Rukovanje nultim vrijednostima s CASE
Zamislite da imate tablicu pod nazivom "kupci" sa stupcima "id", "ime" i "e-pošta". Neki korisnici možda nemaju evidentiranu e-poštu, što bi rezultiralo nultim vrijednostima u stupcu "e-pošta". Možete upotrijebiti funkciju CASE za odgovarajuće nulte vrijednosti. Na primjer:
SELECT nombre,
CASE
WHEN email IS NULL THEN 'Sin correo electrónico'
ELSE email
END AS informacion_contacto
FROM clientes;
U ovom primjeru koristimo CASE za procjenu je li stupac "e-pošta" null. Ako je nula, prikazuje se tekst "Nema e-pošte". U suprotnom, prikazuje se stvarna vrijednost stupca "e-pošta". To nam omogućuje elegantno rješavanje slučajeva u kojima nedostaju podaci za kontakt.
Primjer 7: Kombinacija CASE s agregatnim funkcijama
Funkcija CASE također se može kombinirati s agregatnim funkcijama kao što su SUM, AVG, COUNT itd. Pretpostavimo da imate tablicu pod nazivom "prodaja" sa stupcima "id", "product", "quantity" i "price". Želite izračunati ukupnu prodaju po kategoriji proizvoda koristeći CASE i SUM. Možete to učiniti na sljedeći način:
SELECT
SUM(CASE WHEN precio > 1000 THEN cantidad ELSE 0 END) AS ventas_premium,
SUM(CASE WHEN precio <= 1000 THEN cantidad ELSE 0 END) AS ventas_regulares
FROM ventas;
U ovom primjeru koristimo CASE unutar funkcije SUM za izračun ukupne prodaje po kategoriji proizvoda. Ako je cijena veća od 1000, iznos se dodaje u “premium_sales”. Ako je cijena manja ili jednaka 1000, iznos se dodaje u “regular_sales”. To nam omogućuje da dobijemo međuzbrojeve na temelju specifičnih uvjeta.
Primjer 8: Korištenje CASE u WHERE klauzulama
Funkcija CASE također se može koristiti u klauzuli WHERE za filtriranje zapisa na temelju određenih uvjeta. Pretpostavimo da imate tablicu pod nazivom "zaposlenici" sa stupcima "id", "ime", "odjel" i "plaća". Želite ciljati zaposlenike čija je plaća iznad prosjeka njihovog odjela. Možete to učiniti na sljedeći način:
SELECT nombre, departamento, salario
FROM empleados
WHERE salario > (
SELECT AVG(CASE WHEN e.departamento = empleados.departamento THEN e.salario ELSE NULL END)
FROM empleados e
);
U ovom primjeru koristimo CASE u podupitu za izračun prosječne plaće po odjelu. Podupit uspoređuje odjel svakog zaposlenika s trenutnim odjelom i uzima u obzir samo plaće zaposlenika u istom odjelu za izračun prosjeka. Zatim u glavnom upitu filtriramo zaposlenike čija je plaća veća od prosjeka izračunatog za njihov odjel.
Primjer 9: Generiranje izračunatih stupaca s CASE
Funkcija CASE također se može koristiti za generiranje izračunatih stupaca na temelju specifičnih uvjeta. Pretpostavimo da imate tablicu pod nazivom "narudžbe" sa stupcima "id", "kupac", "ukupno" i "datum". Želite stvoriti dodatni stupac pod nazivom "popust" koji primjenjuje različite postotke popusta ovisno o ukupnom iznosu narudžbe. Možete to učiniti na sljedeći način:
SELECT id, cliente, total,
CASE
WHEN total > 1000 THEN total * 0.10
WHEN total > 500 THEN total * 0.05
ELSE 0
END AS descuento,
fecha
FROM pedidos;
U ovom primjeru koristimo CASE za generiranje izračunatog stupca "popusta". Ako je ukupna narudžba veća od 1000, primjenjuje se popust od 10%. Ako je zbroj veći od 500, primjenjuje se popust od 5%. U svakom drugom slučaju popust se ne primjenjuje. Ovaj izračunati stupac može se koristiti za daljnju analizu ili za prikaz dodatnih informacija u rezultatima upita.
Primjer 10: Implementacija složene logike s ugniježđenim CASE izjavama
U nekim ćete slučajevima možda trebati implementirati složeniju uvjetnu logiku pomoću ugniježđenih CASE naredbi. Pretpostavimo da imate tablicu pod nazivom “students” sa stupcima “id”, “name”, “math_grade” i “language_grade”. Svakom učeniku želite dodijeliti kategoriju na temelju njegovih ocjena iz matematike i jezika. Možete to učiniti na sljedeći način:
SELECT nombre,
CASE
WHEN nota_matematicas >= 90 AND nota_lenguaje >= 90 THEN 'Excelente'
WHEN nota_matematicas >= 80 AND nota_lenguaje >= 80 THEN 'Notable'
ELSE
CASE
WHEN nota_matematicas >= 70 OR nota_lenguaje >= 70 THEN 'Regular'
ELSE 'Necesita mejorar'
END
END AS categoria
FROM estudiantes;
U ovom primjeru koristimo ugniježđene CASE izjave za implementaciju složenije uvjetne logike. Prvo procjenjujemo jesu li ocjene iz matematike i jezika veće ili jednake 90. Ako je tako, dodjeljuje se kategorija "Izvrsno". Zatim procjenjujemo jesu li obje ocjene veće ili jednake 80. Ako jesu, dodjeljuje se kategorija "Istaknuti". Ako niti jedan od gornjih uvjeta nije ispunjen, prelazimo na sljedeću razinu ugniježđenog CASE-a. Ovdje procjenjujemo je li barem jedna od ocjena (matematika ili jezik) veća ili jednaka 70. Ako je tako, dodjeljuje se kategorija "Redovno". Ako niti jedan od uvjeta nije ispunjen, dodjeljuje se kategorija "Potrebno poboljšanje".
Primjer 11: Optimiziranje upita s CASE
Funkcija CASE također se može koristiti za optimizaciju upita i izbjegavanje više zasebnih upita. Pretpostavimo da imate tablicu pod nazivom "prodaja" sa stupcima "id", "proizvod", "količina" i "datum". Želite dobiti ukupnu mjesečnu prodaju i ukupnu godišnju prodaju u jednom upitu. Možete to učiniti na sljedeći način:
SELECT
SUM(CASE WHEN MONTH(fecha) = 1 THEN cantidad ELSE 0 END) AS ventas_enero,
SUM(CASE WHEN MONTH(fecha) = 2 THEN cantidad ELSE 0 END) AS ventas_febrero,
-- ... (continúa para los demás meses)
SUM(CASE WHEN YEAR(fecha) = 2022 THEN cantidad ELSE 0 END) AS ventas_2022,
SUM(CASE WHEN YEAR(fecha) = 2023 THEN cantidad ELSE 0 END) AS ventas_2023
FROM ventas;
U ovom primjeru koristimo CASE unutar funkcije SUM za izračunavanje ukupne prodaje po mjesecima i po godinama u jednom upitu. Za svaki mjesec procjenjujemo odgovara li mjesec datuma prodaje određenom mjesecu i dodajemo odgovarajući iznos. Slično tome, za svaku godinu procjenjujemo odgovara li godina datuma prodaje određenoj godini i dodajemo odgovarajući iznos. To nam omogućuje da dobijemo sve ukupne iznose u jednom učinkovitom upitu.
Najbolje prakse pri korištenju CASE-a u MySQL-u
- Koristite CASE samo kada je potrebno i izbjegavajte njegovu pretjeranu upotrebu, jer može utjecati na izvedbu upita ako se pretjerano koristi.
- Pokušajte zadržati CASE izraze što je moguće jednostavnije i čitljivije. Ako logika postane previše složena, razmislite o razbijanju na više CASE izraza ili korištenju podupita.
- Koristite CASE u kombinaciji s drugim MySQL klauzulama i funkcijama kako biste u potpunosti iskoristili njihov potencijal, kao što su WHERE, ORDER BY, GROUP BY i funkcije agregacije.
- Budite oprezni pri ugniježđivanju višestrukih CASE izraza jer to može otežati čitanje i održavanje vašeg koda. Ako je potrebno, dodajte objašnjenja.
Uobičajene pogreške pri korištenju CASE-a i kako ih izbjeći
- Zaboravite klauzulu ELSE: Obavezno uključite klauzulu ELSE za rješavanje slučajeva u kojima nijedan od uvjeta nije ispunjen. Ako nije navedeno, NULL će biti dodijeljen prema zadanim postavkama.
- Ne završavajte izraz CASE s END: Ne zaboravite uvijek završiti izraz CASE ključnom riječi END. U protivnom ćete dobiti sintaktičku pogrešku.
- Upotreba nekompatibilnih vrsta podataka: Provjerite jesu li rezultati koje vraća svaki WHEN uvjet iste vrste podataka. Ako pomiješate vrste podataka, možete dobiti neočekivane rezultate ili pogreške.
- Ne vodeći računa o redoslijedu uvjeta: Uvjeti u CASE se procjenjuju redoslijedom kojim se pojavljuju. Obavezno stavite specifične uvjete ispred onih općenitijih kako biste dobili željene rezultate.
Alternative za CASE u MySQL-u
Iako je CASE moćna funkcija, postoje neke alternative koje biste trebali razmotriti u određenim slučajevima:
- IF izrazi: IF funkcija u MySQL-u omogućuje vam da procijenite uvjet i vratite vrijednost ako je uvjet istinit i drugu vrijednost ako je lažan. To je jednostavnija alternativa za slučajeve jedinstvenih uvjeta.
- Pregledne tablice: U nekim slučajevima možete koristiti zasebne tablice pretraživanja za pohranu uvjeta i odgovarajućih rezultata. Zatim možete spojiti ove tablice s glavnom tablicom kako biste dobili željene rezultate.
- Pohranjeni pogledi ili funkcije: Ako imate složene upite koji koriste CASE na ponavljajućoj osnovi, možete razmisliti o stvaranju prikaza ili pohranjene funkcije da obuhvati tu logiku i pojednostavi naknadne upite.
Često postavljana pitanja o CASE-u u MySQL-u
1. Mogu li koristiti CASE u kombinaciji s drugim MySQL funkcijama?
Da, možete koristiti CASE u kombinaciji s drugim MySQL funkcijama, kao što su agregatne funkcije (SUM, AVG, COUNT itd.), funkcije datuma i vremena (YEAR, MONTH, DAY itd.), funkcije niza (CONCAT, SUBSTRING, LENGTH itd.) i više.
2. Postoji li ograničenje broja WHEN uvjeta koje mogu koristiti u CASE izrazu?
Ne postoji određeno ograničenje broja WHEN uvjeta koje možete koristiti u CASE izrazu. Međutim, imajte na umu da velik broj uvjeta može utjecati na čitljivost koda i izvedbu upita. Ako imate mnogo uvjeta, razmislite o pojednostavljenju logike ili razbijanju na više CASE izraza.
3. Mogu li koristiti podupit unutar CASE izraza?
Da, možete koristiti podupit unutar CASE izraza, iu uvjetima WHEN iu rezultatima THEN. To vam omogućuje izvođenje složenijih izračuna ili usporedbi na temelju rezultata drugih upita.
4. Kako mogu rukovati null vrijednostima u CASE izrazu?
Možete rukovati null vrijednostima u CASE izrazu pomoću uvjeta IS NULL ili IS NOT NULL. Na primjer, možete koristiti CASE WHEN column IS NULL THEN 'Null value' ELSE column END za dodjelu specifične vrijednosti kada je stupac null i vraćanje stvarne vrijednosti kada nije.
Zaključci slučaja u Mysqlu
Funkcija CASE u MySQL-u moćan je i svestran alat koji vam omogućuje izvođenje uvjetnih operacija unutar vaših upita. Pomoću CASE možete procijeniti različite uvjete i vratiti specifične rezultate ovisno o tome jesu li ti uvjeti ispunjeni ili ne. Primjeri predstavljeni u ovom članku daju vam čvrstu osnovu da počnete koristiti CASE u svojim upitima i prilagodite ga svojim specifičnim potrebama.
Ne zaboravite slijediti najbolje prakse pri korištenju CASE-a, kao što je održavanje jednostavnih i čitljivih izraza, korištenje CASE-a u kombinaciji s drugim MySQL klauzulama i funkcijama te razmatranje alternativa kada je to prikladno. Vježbom i eksperimentiranjem moći ćete u potpunosti iskoristiti CASE u MySQL-u i poboljšati učinkovitost i čitljivost svojih upita.
Ako imate bilo kakvih dodatnih pitanja ili trebate više primjera, slobodno potražite dodatne resurse ili pogledajte službenu MySQL dokumentaciju. Nastavite istraživati i iskorištavati snagu CASE-a u svojim projektima baze podataka!
Dodatna sredstva:
Indeks
- 0.1 Što je funkcija CASE u MySQL-u?
- 0.2 Osnovna CASE sintaksa u MySQL-u
- 0.3 Primjer 1: Klasificirajte učenike prema njihovom prosjeku
- 0.4 Primjer 2: Dodjeljivanje kategorija proizvoda
- 0.5 Primjer 3: Izračunajte popuste na temelju kupljene količine
- 0.6 Primjer 4: Pretvaranje numeričkih vrijednosti u raspone
- 0.7 Primjer 5: Dodjeljivanje oznaka na temelju više uvjeta
- 0.8 Primjer 6: Rukovanje nultim vrijednostima s CASE
- 0.9 Primjer 7: Kombinacija CASE s agregatnim funkcijama
- 0.10 Primjer 8: Korištenje CASE u WHERE klauzulama
- 0.11 Primjer 9: Generiranje izračunatih stupaca s CASE
- 0.12 Primjer 10: Implementacija složene logike s ugniježđenim CASE izjavama
- 0.13 Primjer 11: Optimiziranje upita s CASE
- 1 Najbolje prakse pri korištenju CASE-a u MySQL-u
- 2 Uobičajene pogreške pri korištenju CASE-a i kako ih izbjeći
- 3 Alternative za CASE u MySQL-u
- 4 Često postavljana pitanja o CASE-u u MySQL-u
- 5 Zaključci slučaja u Mysqlu