- CASE-funktionen i MySQL giver dig mulighed for at udføre betingede evalueringer og returnere brugerdefinerede resultater.
- Flere betingelser kan bruges med WHEN-klausulen, og nullværdier kan håndteres med ELSE.
- CASE kan kombineres med aggregeringsfunktioner for at optimere forespørgsler.
- Det er vigtigt at følge bedste praksis ved brug af CASE for at opretholde kodens ydeevne og læsbarhed.
CASE-funktionen i MySQL er et kraftfuldt værktøj, der giver dig mulighed for at udføre betingede operationer i dine forespørgsler. Med CASE kan du evaluere forskellige betingelser og returnere specifikke resultater afhængigt af, om disse betingelser er opfyldt eller ej. Vi vil forklare denne funktion med praktiske eksempler, der vil hjælpe dig med at mestre brugen af CASE i MySQL og forbedre dine færdigheder i databasestyring.
Hvad er CASE-funktionen i MySQL?
CASE-funktionen i MySQL Det er et betinget udtryk, der giver dig mulighed for at evaluere forskellige betingelser og returnere specifikke resultater afhængigt af, om disse betingelser er opfyldt eller ej. Det er et meget nyttigt værktøj til at udføre logiske operationer i dine forespørgsler og opnå personlige resultater baseret på specifikke kriterier.
CASE fungerer på samme måde som en række IF-THEN-ELSE-sætninger, hvor du kan angive flere betingelser og de værdier, der skal returneres, når disse betingelser er opfyldt. Hvis ingen af betingelserne er opfyldt, kan du definere en standardværdi ved hjælp af ELSE-sætningen.
Grundlæggende CASE-syntaks i MySQL
Den grundlæggende syntaks for CASE-funktionen i MySQL er som følger:
CASE
WHEN condición1 THEN resultado1
WHEN condición2 THEN resultado2
...
WHEN condiciónN THEN resultadoN
ELSE resultado_predeterminado
END
Her er en forklaring af hver del af syntaksen:
WHEN: Specificerer den betingelse, der skal evalueres.THEN: Angiver det resultat, der vil blive returneret, hvis den tilsvarende betingelse er opfyldt.ELSE: (Valgfrit) Angiver det resultat, der skal returneres, hvis ingen af ovenstående betingelser er opfyldt.END: Markerer slutningen af CASE-udtrykket.
Nu hvor du kender den grundlæggende syntaks, lad os undersøge nogle praktiske eksempler!
Eksempel 1: Klassificer eleverne efter deres gennemsnit
Antag, at du har en tabel kaldet "elever" med følgende kolonner: "id", "navn" og "avg". Du vil rangere eleverne efter deres GPA ved hjælp af CASE-funktionen. Du kan gøre det på denne måde:
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;
I dette eksempel bruger vi CASE til at evaluere hver elevs gennemsnit og tildele en tilsvarende rang. Hvis gennemsnittet er større end eller lig med 90, klassificeres det som "Udestående". Hvis det er mellem 80 og 89, er det klassificeret som "Bemærkelsesværdigt" og så videre. Hvis gennemsnittet er mindre end 60, klassificeres det som "Utilstrækkeligt".
Eksempel 2: Tildeling af produktkategorier
Forestil dig, at du har en tabel kaldet "produkter" med kolonnerne "id", "navn" og "pris". Du ønsker at tildele en kategori til hvert produkt baseret på dets pris ved hjælp af CASE-funktionen. Du kan gøre det på denne måde:
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;
I dette eksempel bruger vi CASE til at vurdere prisen på hvert produkt og tildele en tilsvarende kategori. Hvis prisen er større end 1000, er den klassificeret som "Premium". Hvis det er mellem 500 og 1000, klassificeres det som "High-End" og så videre. Hvis prisen er mindre end eller lig med 100, er den klassificeret som "Økonomisk".
Eksempel 3: Beregn rabatter baseret på købt mængde
Antag, at du har en tabel kaldet "salg" med kolonnerne "id", "produkt" og "antal". Du vil beregne rabatten på hvert salg baseret på den købte mængde ved hjælp af CASE-funktionen. Du kan gøre det på denne måde:
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;
I dette eksempel bruger vi CASE til at vurdere den købte mængde af hvert produkt og beregne den tilsvarende rabat. Hvis mængden er større end eller lig med 100, gives 20 % rabat. Er den mellem 50 og 99, gives der 15 % rabat, og så videre. Er mængden mindre end 20, er der ingen rabat.
Eksempel 4: Konvertering af numeriske værdier til områder
Forestil dig, at du har en tabel kaldet "medarbejdere" med kolonnerne "id", "navn" og "alder". Du vil konvertere medarbejdernes aldre til intervaller ved hjælp af CASE-funktionen. Du kan gøre det på denne måde:
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;
I dette eksempel bruger vi CASE til at evaluere alderen på hver medarbejder og tildele et tilsvarende interval. Hvis alderen er større end eller lig med 60 år, klassificeres den som "Senior". Hvis du er mellem 40 og 59, bliver du klassificeret som "Middelaldrende" og så videre. Hvis alderen er under 20 år, klassificeres den som "Minor".
Eksempel 5: Tildeling af etiketter baseret på flere betingelser
Antag, at du har en tabel kaldet "ordrer" med kolonnerne "id", "kunde", "total" og "status". Du vil tildele etiketter til hver ordre baseret på dens total og status ved hjælp af CASE-funktionen med flere betingelser. Du kan gøre det på denne måde:
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;
I dette eksempel bruger vi CASE med flere betingelser til at evaluere både totalen og status for hver ordre og tildele en passende etiket. Hvis totalen er større end 1000, og status er "Leveret", er den mærket som "VIP". Hvis det samlede antal er større end 500, og status er "Leveret", er det tagget som "Prioritet". Hvis status er "Afventer", er den mærket som "I proces". Ellers er det mærket som "Almindelig".
Eksempel 6: Håndtering af nulværdier med CASE
Forestil dig, at du har en tabel kaldet "kunder" med kolonnerne "id", "navn" og "e-mail". Nogle kunder har muligvis ikke en e-mail registreret, hvilket ville resultere i nulværdier i kolonnen "e-mail". Du kan bruge CASE-funktionen til at håndtere disse null-værdier på passende vis. For eksempel:
SELECT nombre,
CASE
WHEN email IS NULL THEN 'Sin correo electrónico'
ELSE email
END AS informacion_contacto
FROM clientes;
I dette eksempel bruger vi CASE til at vurdere, om kolonnen "e-mail" er nul. Hvis null, vises teksten "Ingen e-mail". Ellers vises den faktiske værdi af kolonnen "e-mail". Dette giver os mulighed for elegant at håndtere sager, hvor kontaktoplysninger mangler.
Eksempel 7: Kombination af CASE med aggregerede funktioner
CASE-funktionen kan også kombineres med aggregerede funktioner som SUM, AVG, COUNT osv. Antag, at du har en tabel kaldet "salg" med kolonnerne "id", "produkt", "mængde" og "pris". Du ønsker at beregne det samlede salg efter produktkategori ved hjælp af CASE og SUM. Du kan gøre det på denne måde:
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;
I dette eksempel bruger vi CASE inde i SUM-funktionen til at beregne det samlede salg efter produktkategori. Hvis prisen er større end 1000,- lægges beløbet til "premium_sales". Hvis prisen er mindre end eller lig med 1000, lægges beløbet til "almindelige_udsalg". Dette giver os mulighed for at få subtotaler baseret på specifikke forhold.
Eksempel 8: Brug af CASE i WHERE-sætninger
CASE-funktionen kan også bruges i WHERE-udtrykket til at filtrere poster baseret på specifikke forhold. Antag, at du har en tabel kaldet "medarbejdere" med kolonnerne "id", "navn", "afdeling" og "løn". Du ønsker at målrette medarbejdere, hvis løn er over gennemsnittet for deres afdeling. Du kan gøre det på denne måde:
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
);
I dette eksempel bruger vi CASE i underforespørgslen til at beregne den gennemsnitlige løn pr. afdeling. Underforespørgslen sammenligner hver medarbejders afdeling med den aktuelle afdeling og tager kun hensyn til lønningerne for medarbejdere i samme afdeling for at beregne gennemsnittet. Derefter filtrerer vi i hovedforespørgslen medarbejdere fra, hvis løn er højere end gennemsnittet beregnet for deres afdeling.
Eksempel 9: Generering af beregnede kolonner med CASE
CASE-funktionen kan også bruges til at generere beregnede kolonner baseret på specifikke forhold. Antag, at du har en tabel kaldet "ordrer" med kolonnerne "id", "kunde", "total" og "dato". Du vil oprette en ekstra kolonne kaldet "rabat", der anvender forskellige rabatprocenter afhængigt af ordretotalen. Du kan gøre det på denne måde:
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;
I dette eksempel bruger vi CASE til at generere den beregnede "rabat"-kolonne. Hvis den samlede ordre er større end 1000, gives 10 % rabat. Hvis totalen er større end 500, gives 5 % rabat. I alle andre tilfælde gælder der ingen rabat. Denne beregnede kolonne kan bruges til yderligere analyse eller til at vise yderligere oplysninger i forespørgselsresultaterne.
Eksempel 10: Implementering af kompleks logik med indlejrede CASE-sætninger
I nogle tilfælde skal du muligvis implementere mere kompleks betinget logik ved hjælp af indlejrede CASE-sætninger. Antag, at du har en tabel kaldet "elever" med kolonnerne "id", "navn", "math_grade" og "language_grade". Du vil tildele en kategori til hver elev baseret på deres karakterer i matematik og sprog. Du kan gøre det på denne måde:
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;
I dette eksempel bruger vi indlejrede CASE-sætninger til at implementere mere kompleks betinget logik. Først vurderer vi, om både matematik- og sprogkaraktererne er større end eller lig med 90. Hvis det er tilfældet, tildeles kategorien "Fremragende". Derefter vurderer vi, om begge karakterer er større end eller lig med 80. Hvis det er tilfældet, tildeles kategorien "Notable". Hvis ingen af ovenstående betingelser er opfyldt, går vi til næste niveau af indlejret CASE. Her vurderer vi, om mindst én af karaktererne (matematik eller sprog) er større end eller lig med 70. Hvis det er tilfældet, tildeles kategorien "Almindelig". Hvis ingen af betingelserne er opfyldt, tildeles kategorien "Behov for forbedring".
Eksempel 11: Optimering af forespørgsler med CASE
CASE-funktionen kan også bruges til at optimere forespørgsler og undgå flere separate forespørgsler. Antag, at du har en tabel kaldet "salg" med kolonnerne "id", "produkt", "antal" og "dato". Du ønsker at få det samlede salg pr. måned og det samlede salg pr. år i en enkelt forespørgsel. Du kan gøre det på denne måde:
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;
I dette eksempel bruger vi CASE inde i SUM-funktionen til at beregne salgstotaler efter måned og år i en enkelt forespørgsel. For hver måned vurderer vi, om måneden for salgsdatoen matcher den specifikke måned og tilføjer det tilsvarende beløb. Tilsvarende vurderer vi for hvert år, om salgsdatoens år stemmer overens med det specifikke år og tilføjer det tilsvarende beløb. Dette giver os mulighed for at få alle totalerne i én effektiv forespørgsel.
Bedste praksis ved brug af CASE i MySQL
- Brug kun CASE, når det er nødvendigt, og undgå at overbruge det, da det kan påvirke forespørgselsydeevnen, hvis det bruges overdrevent.
- Prøv at holde CASE-udtryk så enkle og læsbare som muligt. Hvis logikken bliver for kompleks, kan du overveje at dele den op i flere CASE-udtryk eller bruge underforespørgsler.
- Brug CASE i kombination med andre MySQL-klausuler og funktioner for at udnytte deres potentiale fuldt ud, såsom i WHERE, ORDER BY, GROUP BY og aggregeringsfunktioner.
- Vær forsigtig, når du indlejrer flere CASE-udtryk, da det kan gøre din kode svær at læse og vedligeholde. Tilføj eventuelt forklarende kommentarer.
Almindelige fejl ved brug af CASE og hvordan man undgår dem
- Glem ELSE-klausulen: Sørg for at inkludere ELSE-klausulen for at håndtere sager, hvor ingen af betingelserne er opfyldt. Hvis det ikke er angivet, vil NULL blive tildelt som standard.
- Afslut ikke CASE-udtrykket med END: Husk altid at afslutte CASE-udtrykket med søgeordet END. Ellers får du en syntaksfejl.
- Brug af inkompatible datatyper: Sørg for, at de resultater, der returneres af hver WHEN-betingelse, er af samme datatype. Hvis du blander datatyper, kan du få uventede resultater eller fejl.
- Ikke i betragtning af rækkefølgen af betingelser: Betingelser i CASE vurderes i den rækkefølge, de optræder. Sørg for at placere de mere specifikke forhold før de mere generelle for at få de ønskede resultater.
Alternativer til CASE i MySQL
Selvom CASE er en kraftfuld funktion, er der nogle alternativer, du kan overveje i visse tilfælde:
- HVIS udtryk: Den IF-funktion i MySQL giver dig mulighed for at evaluere en betingelse og returnere en værdi, hvis betingelsen er sand, og en anden værdi, hvis den er falsk. Det er et enklere alternativ til tilfælde af unikke forhold.
- Opslagstabeller: I nogle tilfælde kan du bruge separate opslagstabeller til at gemme betingelserne og de tilsvarende resultater. Du kan derefter forbinde disse tabeller med hovedtabellen for at få de ønskede resultater.
- Gemte visninger eller funktioner: Hvis du har komplekse forespørgsler, der bruger CASE på en tilbagevendende basis, kan du overveje at oprette visninger eller gemte funktioner at indkapsle denne logik og forenkle efterfølgende forespørgsler.
Ofte stillede spørgsmål om CASE i MySQL
1. Kan jeg bruge CASE i kombination med andre MySQL-funktioner?
Ja, du kan bruge CASE i kombination med andre MySQL-funktioner, såsom aggregerede funktioner (SUM, AVG, COUNT osv.), dato- og tidsfunktioner (ÅR, MÅNED, DAG osv.), strengfunktioner (CONCAT, SUBSTRING, LENGTH osv.) og mere.
2. Er der en grænse for antallet af WHEN-betingelser, jeg kan bruge i et CASE-udtryk?
Der er ingen specifik grænse for antallet af WHEN-betingelser, du kan bruge i et CASE-udtryk. Husk dog, at en lang række forhold kan påvirke kodelæsbarhed og forespørgselsydeevne. Hvis du har mange betingelser, kan du overveje at forenkle logikken eller opdele den i flere CASE-udtryk.
3. Kan jeg bruge underforespørgsler i et CASE-udtryk?
Ja, du kan bruge underforespørgsler i et CASE-udtryk, både i WHEN-betingelser og THEN-resultater. Dette giver dig mulighed for at udføre mere komplekse beregninger eller sammenligninger baseret på resultaterne af andre forespørgsler.
4. Hvordan kan jeg håndtere null-værdier i et CASE-udtryk?
Du kan håndtere null-værdier i et CASE-udtryk ved at bruge tilstanden IS NULL eller IS NOT NULL. For eksempel kan du bruge CASE, NÅR kolonnen ER NULL THEN 'Nullværdi' ELSE kolonne END til at tildele en specifik værdi, når kolonnen er nul, og returnere den faktiske værdi, når den ikke er det.
Sagskonklusioner i Mysql
CASE-funktionen i MySQL er et kraftfuldt og alsidigt værktøj, der giver dig mulighed for at udføre betingede operationer i dine forespørgsler. Med CASE kan du evaluere forskellige betingelser og returnere specifikke resultater afhængigt af, om disse betingelser er opfyldt eller ej. Eksemplerne præsenteret i denne artikel giver dig et solidt grundlag for at begynde at bruge CASE i dine egne forespørgsler og tilpasse det til dine specifikke behov.
Husk at følge bedste praksis, når du bruger CASE, såsom at holde udtryk enkle og læsbare, bruge CASE i kombination med andre klausuler, og MySQL-funktioner, og overvej alternativer, hvor det er relevant. Med øvelse og eksperimenter kan du udnytte potentialet i CASE i MySQL fuldt ud og forbedre effektiviteten og læsbarheden af dine forespørgsler.
Hvis du har yderligere spørgsmål eller har brug for flere eksempler, er du velkommen til at søge efter yderligere ressourcer eller konsultere den officielle MySQL-dokumentation. Bliv ved med at udforske og udnytte kraften i CASE i dine databaseprojekter!
Yderligere ressourcer:
Indholdsfortegnelse
- Hvad er CASE-funktionen i MySQL?
- Grundlæggende CASE-syntaks i MySQL
- Eksempel 1: Klassificer eleverne efter deres gennemsnit
- Eksempel 2: Tildeling af produktkategorier
- Eksempel 3: Beregn rabatter baseret på købt mængde
- Eksempel 4: Konvertering af numeriske værdier til områder
- Eksempel 5: Tildeling af etiketter baseret på flere betingelser
- Eksempel 6: Håndtering af nulværdier med CASE
- Eksempel 7: Kombination af CASE med aggregerede funktioner
- Eksempel 8: Brug af CASE i WHERE-sætninger
- Eksempel 9: Generering af beregnede kolonner med CASE
- Eksempel 10: Implementering af kompleks logik med indlejrede CASE-sætninger
- Eksempel 11: Optimering af forespørgsler med CASE
- Bedste praksis ved brug af CASE i MySQL
- Almindelige fejl ved brug af CASE og hvordan man undgår dem
- Alternativer til CASE i MySQL
- Ofte stillede spørgsmål om CASE i MySQL
- Sagskonklusioner i Mysql