- CASE-funktionen i MySQL låter dig utföra villkorliga utvärderingar och returnera anpassade resultat.
- Flera villkor kan användas med WHEN-klausulen och nullvärden kan hanteras med ELSE.
- CASE kan kombineras med aggregeringsfunktioner för att optimera frågor.
- Att följa bästa praxis när man använder CASE är avgörande för att bibehålla kodens prestanda och läsbarhet.
CASE-funktionen i MySQL är ett kraftfullt verktyg som låter dig utföra villkorade operationer i dina frågor. Med CASE kan du utvärdera olika villkor och returnera specifika resultat beroende på om dessa villkor är uppfyllda eller inte. Vi kommer att förklara denna funktion med praktiska exempel som hjälper dig att bemästra användningen av CASE i MySQL och förbättra dina kunskaper i databashantering.
Vad är CASE-funktionen i MySQL?
CASE-funktionen i MySQL är ett villkorligt uttryck som låter dig utvärdera olika villkor och returnera specifika resultat beroende på om dessa villkor är uppfyllda. Det är ett mycket användbart verktyg för att utföra logiska operationer inom dina frågor och få anpassade resultat baserat på specifika kriterier.
CASE fungerar på samma sätt som en serie IF-THEN-ELSE-satser, där du kan ange flera villkor och de värden som ska returneras när dessa villkor är uppfyllda. Om inget av villkoren är uppfyllt kan du definiera ett standardvärde med hjälp av ELSE-satsen.
Grundläggande CASE-syntax i MySQL
Den grundläggande syntaxen för CASE-funktionen i MySQL är följande:
CASE
WHEN condición1 THEN resultado1
WHEN condición2 THEN resultado2
...
WHEN condiciónN THEN resultadoN
ELSE resultado_predeterminado
END
Här är en förklaring av varje del av syntaxen:
WHEN: Anger villkoret som ska utvärderas.THEN: Indikerar resultatet som kommer att returneras om motsvarande villkor är uppfyllt.ELSE: (Valfritt) Anger resultatet som ska returneras om inget av ovanstående villkor är uppfyllt.END: Markerar slutet på CASE-uttrycket.
Nu när du känner till den grundläggande syntaxen, låt oss utforska några praktiska exempel!
Exempel 1: Klassificera eleverna efter deras genomsnitt
Anta att du har en tabell som heter "studenter" med följande kolumner: "id", "namn" och "avg". Du vill rangordna eleverna efter deras GPA med hjälp av CASE-funktionen. Du kan göra så här:
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 det här exemplet använder vi CASE för att utvärdera varje elevs medelvärde och tilldela en motsvarande rang. Om genomsnittet är större än eller lika med 90 klassificeras det som "Utestående". Om det är mellan 80 och 89 klassificeras det som "Anmärkningsvärt" och så vidare. Om genomsnittet är mindre än 60 klassificeras det som "Otillräckligt".
Exempel 2: Tilldela produktkategorier
Föreställ dig att du har en tabell som heter "produkter" med kolumnerna "id", "namn" och "pris". Du vill tilldela en kategori till varje produkt baserat på dess pris med hjälp av CASE-funktionen. Du kan göra så här:
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 det här exemplet använder vi CASE för att utvärdera priset på varje produkt och tilldela en motsvarande kategori. Om priset är högre än 1000 klassas det som "Premium". Om det är mellan 500 och 1000 klassificeras det som "High-End" och så vidare. Om priset är mindre än eller lika med 100 klassificeras det som "Ekonomiskt".
Exempel 3: Beräkna rabatter baserat på köpt kvantitet
Anta att du har en tabell som heter "försäljning" med kolumnerna "id", "produkt" och "kvantitet". Du vill beräkna rabatten som tillämpas på varje försäljning baserat på den köpta kvantiteten med funktionen CASE. Du kan göra så här:
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 det här exemplet använder vi CASE för att utvärdera den köpta kvantiteten av varje produkt och beräkna motsvarande rabatt. Om mängden är större än eller lika med 100, ges 20 % rabatt. Är det mellan 50 och 99 tillämpas 15% rabatt osv. Om antalet är mindre än 20 gäller ingen rabatt.
Exempel 4: Konvertera numeriska värden till intervall
Föreställ dig att du har en tabell som heter "anställda" med kolumnerna "id", "namn" och "ålder". Du vill konvertera anställdas åldrar till intervall med funktionen CASE. Du kan göra så här:
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 det här exemplet använder vi CASE för att utvärdera åldern på varje anställd och tilldela ett motsvarande intervall. Om åldern är högre än eller lika med 60 klassas den som "Senior". Om du är mellan 40 och 59 klassas du som "medelålders" och så vidare. Om åldern är mindre än 20 klassas den som "Minor".
Exempel 5: Tilldela etiketter baserat på flera villkor
Anta att du har en tabell som heter "ordrar" med kolumnerna "id", "kund", "totalt" och "status". Du vill tilldela etiketter till varje beställning baserat på dess totala och status med hjälp av CASE-funktionen med flera villkor. Du kan göra så här:
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 det här exemplet använder vi CASE med flera villkor för att utvärdera både summan och statusen för varje beställning och tilldela en lämplig etikett. Om summan är större än 1000 500 och statusen är "Levererad", är den märkt som "VIP". Om det totala antalet är större än XNUMX och statusen är "Leverat" är det taggat som "Prioritet". Om statusen är "Väntande" är den märkt som "Pågår". Annars är den märkt som "vanlig".
Exempel 6: Hantera nollvärden med CASE
Föreställ dig att du har en tabell som heter "kunder" med kolumnerna "id", "namn" och "e-post". Vissa kunder kanske inte har ett e-postmeddelande, vilket skulle resultera i nollvärden i kolumnen "e-post". Du kan använda CASE-funktionen för att hantera dessa nollvärden på lämpligt sätt. Till exempel:
SELECT nombre,
CASE
WHEN email IS NULL THEN 'Sin correo electrónico'
ELSE email
END AS informacion_contacto
FROM clientes;
I det här exemplet använder vi CASE för att utvärdera om kolumnen "e-post" är null. Om null visas texten "Ingen e-post". Annars visas det faktiska värdet för kolumnen "e-post". Detta gör att vi på ett elegant sätt kan hantera fall där kontaktinformation saknas.
Exempel 7: Kombinera CASE med aggregerade funktioner
CASE-funktionen kan också kombineras med aggregerade funktioner som SUM, AVG, COUNT, etc. Anta att du har en tabell som heter "försäljning" med kolumnerna "id", "produkt", "kvantitet" och "pris". Du vill beräkna total försäljning per produktkategori med CASE och SUMMA. Du kan göra så här:
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 det här exemplet använder vi CASE i SUM-funktionen för att beräkna den totala försäljningen per produktkategori. Om priset är högre än 1000 läggs beloppet till "premium_sales". Om priset är mindre än eller lika med 1000 läggs beloppet till "vanlig_försäljning". Detta gör att vi kan få delsummor baserat på specifika förutsättningar.
Exempel 8: Använda CASE i WHERE-satser
CASE-funktionen kan också användas i WHERE-satsen för att filtrera poster baserat på specifika villkor. Anta att du har en tabell som heter "anställda" med kolumnerna "id", "namn", "avdelning" och "lön". Du vill rikta in dig på medarbetare vars lön ligger över genomsnittet för deras avdelning. Du kan göra så här:
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 det här exemplet använder vi CASE i underfrågan för att beräkna medellönen per avdelning. Underfrågan jämför varje anställds avdelning med den aktuella avdelningen och tar endast hänsyn till lönerna för anställda på samma avdelning för att beräkna genomsnittet. Sedan, i huvudfrågan, filtrerar vi bort anställda vars lön är högre än genomsnittet som beräknats för deras avdelning.
Exempel 9: Generera beräknade kolumner med CASE
CASE-funktionen kan också användas för att generera beräknade kolumner baserat på specifika förhållanden. Anta att du har en tabell som heter "order" med kolumnerna "id", "kund", "totalt" och "datum". Du vill skapa en extra kolumn som heter "rabatt" som tillämpar olika rabattprocent beroende på ordersumman. Du kan göra så här:
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 det här exemplet använder vi CASE för att generera den beräknade "rabatt"-kolumnen. Om den totala beställningen är större än 1000, ges 10 % rabatt. Om summan är större än 500, ges 5 % rabatt. I alla andra fall gäller ingen rabatt. Denna beräknade kolumn kan användas för ytterligare analys eller för att visa ytterligare information i frågeresultaten.
Exempel 10: Implementering av komplex logik med kapslade CASE-satser
I vissa fall kan du behöva implementera mer komplex villkorlig logik med hjälp av kapslade CASE-satser. Anta att du har en tabell som heter "studenter" med kolumnerna "id", "namn", "math_grade" och "language_grade". Du vill tilldela en kategori till varje elev baserat på deras betyg i matematik och språk. Du kan göra så här:
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 det här exemplet använder vi kapslade CASE-satser för att implementera mer komplex villkorlig logik. Först utvärderar vi om både matte- och språkbetygen är högre än eller lika med 90. Om så är fallet tilldelas kategorin "Utmärkt". Sedan utvärderar vi om båda betygen är högre än eller lika med 80. Om så är fallet tilldelas kategorin "Anmärkningsvärt". Om inget av ovanstående villkor är uppfyllt, går vi till nästa nivå av kapslade CASE. Här utvärderar vi om minst ett av betygen (matematik eller språk) är högre än eller lika med 70. Om så är fallet tilldelas kategorin ”Vanligt”. Om inget av villkoren är uppfyllt tilldelas kategorin "Behöver förbättring".
Exempel 11: Optimera frågor med CASE
CASE-funktionen kan också användas för att optimera frågor och undvika flera separata frågor. Anta att du har en tabell som heter "försäljning" med kolumnerna "id", "produkt", "kvantitet" och "datum". Du vill få den totala försäljningen per månad och den totala försäljningen per år i en enda fråga. Du kan göra så här:
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 det här exemplet använder vi CASE i SUM-funktionen för att beräkna försäljningssummor per månad och år i en enda fråga. För varje månad utvärderar vi om månaden för försäljningsdatum matchar den specifika månaden och lägger till motsvarande belopp. På samma sätt, för varje år, utvärderar vi om året för försäljningsdatumet matchar det specifika året och lägger till motsvarande belopp. Detta gör att vi kan få alla summor i en effektiv fråga.
Bästa metoder när du använder CASE i MySQL
- Använd endast CASE när det behövs och undvik att överanvända det, eftersom det kan påverka frågeprestanda om det används överdrivet.
- Försök att hålla CASE-uttryck så enkla och läsbara som möjligt. Om logiken blir för komplex, överväg att dela upp den i flera CASE-uttryck eller använda underfrågor.
- Använd CASE i kombination med andra MySQL-klausuler och funktioner för att dra full nytta av deras potential, till exempel i WHERE, ORDER BY, GRUPP AV och aggregeringsfunktioner.
- Var försiktig när du kapslar flera CASE-uttryck, eftersom det kan göra din kod svår att läsa och underhålla. Om det behövs, lägg till förklarande kommentarer.
Vanliga misstag när man använder CASE och hur man undviker dem
- Glöm ELSE-satsen: Se till att inkludera ELSE-klausulen för att hantera fall där inget av villkoren är uppfyllda. Om det inte anges kommer NULL att tilldelas som standard.
- Avsluta inte CASE-uttrycket med END: Kom ihåg att alltid avsluta CASE-uttrycket med nyckelordet END. Annars får du ett syntaxfel.
- Använda inkompatibla datatyper: Se till att resultaten som returneras av varje WHEN-villkor är av samma datatyp. Om du blandar datatyper kan du få oväntade resultat eller fel.
- Utan hänsyn till villkorens ordning: Villkoren i CASE utvärderas i den ordning de visas. Se till att placera de mer specifika villkoren före de mer allmänna för att få önskat resultat.
Alternativ till CASE i MySQL
Även om CASE är en kraftfull funktion, finns det några alternativ du kan överväga i vissa fall:
- IF uttryck: Den IF-funktion i MySQL låter dig utvärdera ett villkor och returnera ett värde om villkoret är sant och ett annat värde om det är falskt. Det är ett enklare alternativ för fall av unika förhållanden.
- Uppslagstabeller: I vissa fall kan du använda separata uppslagstabeller för att lagra villkoren och motsvarande resultat. Du kan sedan sammanfoga dessa tabeller med huvudtabellen för att få önskat resultat.
- Lagrade vyer eller funktioner: Om du har komplexa frågor som använder CASE på återkommande basis kan du överväga att skapa vyer eller lagrade funktioner för att kapsla in den logiken och förenkla efterföljande frågor.
Vanliga frågor om CASE i MySQL
1. Kan jag använda CASE i kombination med andra MySQL-funktioner?
Ja, du kan använda CASE i kombination med andra MySQL-funktioner, såsom aggregerade funktioner (SUM, AVG, COUNT, etc.), datum- och tidsfunktioner (ÅR, MÅNAD, DAG, etc.), strängfunktioner (CONCAT, SUBSTRING, LENGTH, etc.) med mera.
2. Finns det en gräns för antalet WHEN-villkor jag kan använda i ett CASE-uttryck?
Det finns ingen specifik gräns för antalet WHEN-villkor som du kan använda i ett CASE-uttryck. Kom dock ihåg att ett stort antal villkor kan påverka kodläsbarhet och frågeprestanda. Om du har många villkor, överväg att förenkla logiken eller dela upp den i flera CASE-uttryck.
3. Kan jag använda underfrågor i ett CASE-uttryck?
Ja, du kan använda underfrågor inom ett CASE-uttryck, både i WHEN-villkor och THEN-resultat. Detta gör att du kan utföra mer komplexa beräkningar eller jämförelser baserat på resultaten av andra frågor.
4. Hur kan jag hantera nollvärden i ett CASE-uttryck?
Du kan hantera nollvärden i ett CASE-uttryck med villkoret IS NULL eller IS NOT NULL. Du kan till exempel använda CASE WHEN column IS NULL THEN 'Null value' ELSE kolumn END för att tilldela ett specifikt värde när kolumnen är null och returnera det faktiska värdet när det inte är det.
Fallslutsatser i Mysql
CASE-funktionen i MySQL är ett kraftfullt och mångsidigt verktyg som låter dig utföra villkorade operationer i dina frågor. Med CASE kan du utvärdera olika villkor och returnera specifika resultat beroende på om dessa villkor är uppfyllda eller inte. Exemplen som presenteras i den här artikeln ger dig en solid grund för att börja använda CASE i dina egna frågor och anpassa det efter dina specifika behov.
Kom ihåg att följa bästa praxis när du använder CASE, som att hålla uttryck enkla och läsbara, använda CASE i kombination med andra MySQL-klausuler och funktioner , och överväga alternativ när det är lämpligt. Med övning och experimenterande kommer du att kunna dra full nytta av CASE i MySQL och förbättra effektiviteten och läsbarheten hos dina frågor.
Om du har ytterligare frågor eller behöver fler exempel, sök gärna efter ytterligare resurser eller konsultera den officiella MySQL-dokumentationen. Fortsätt utforska och utnyttja kraften i CASE i dina databasprojekt!
Ytterligare resurser:
Index
- 0.1 Vad är CASE-funktionen i MySQL?
- 0.2 Grundläggande CASE-syntax i MySQL
- 0.3 Exempel 1: Klassificera eleverna efter deras genomsnitt
- 0.4 Exempel 2: Tilldela produktkategorier
- 0.5 Exempel 3: Beräkna rabatter baserat på köpt kvantitet
- 0.6 Exempel 4: Konvertera numeriska värden till intervall
- 0.7 Exempel 5: Tilldela etiketter baserat på flera villkor
- 0.8 Exempel 6: Hantera nollvärden med CASE
- 0.9 Exempel 7: Kombinera CASE med aggregerade funktioner
- 0.10 Exempel 8: Använda CASE i WHERE-satser
- 0.11 Exempel 9: Generera beräknade kolumner med CASE
- 0.12 Exempel 10: Implementering av komplex logik med kapslade CASE-satser
- 0.13 Exempel 11: Optimera frågor med CASE
- 1 Bästa metoder när du använder CASE i MySQL
- 2 Vanliga misstag när man använder CASE och hur man undviker dem
- 3 Alternativ till CASE i MySQL
- 4 Vanliga frågor om CASE i MySQL
- 5 Fallslutsatser i Mysql