2.1 CASE-verklaring

Er zijn twee manieren om een ​​instructie in SQL te schrijven CASE. Het eerste item laat het lijken op een overstap van de Java-taal, terwijl het tweede formaat meer op meervoud lijkt if-else.

Laten we beginnen met de eerste optie - een analoog van schakelaar. De algemene indeling is:

CASE case_value
	WHEN value1 THEN result1
	[WHEN value2 THEN result2] ...
	[ELSE resultN]
END

Echt erg vergelijkbaar met switch, alleen de woorden zijn iets anders:

SQL Java
geval x schakelaar (x) {
wanneer waarde gevalwaarde:
dan resultaat resultaat retourneren;
anders resultaat standaard: retourresultaat;
einde }

Laten we een voorbeeld van Java naar SQL vertalen:

Java SQL
switch (a) {
   case 1: return "one";
   case 2: return "two";
   case 3: return "three";
   default: return "unknown";
}
CASE a
   WHEN 1 THEN 'one'
   WHEN 2 THEN 'two'
   WHEN 3 THEN 'three'
   ELSE 'unknown'
END

2.2 Tweede versie van de CASE-verklaring

Er is ook een tweede versie van de operator CASE, die, zoals hierboven vermeld, meer op meervoud lijkt if-else. De algemene indeling is:

CASE
	WHEN condition 1 THEN result1
	[WHEN condition 2 THEN result2] ...
	[ELSE resultN]
END

Hier worden de voorwaarden eenvoudig opeenvolgend gecontroleerd, als een van deze waar is, wordt het opgegeven resultaat geretourneerd. Als geen van de voorwaarden waar is, wordt de waarde die is opgegeven in ELSE.

Laten we een voorbeeld van Java naar SQL vertalen:

Java SQL
if (a == 3)
	return "three";
CASE
   WHEN a=3 THEN 'three'
END
if (a == 3)
	return "three";
else
	return "zero";
CASE
   WHEN a=3 THEN 'three'
   ELSE 'zero'
END
if (a == 1)
	return "three";
else if (a == 2)
	return "two";
else if (a == 3)
	return "three";
else
	return "zero";
CASE
   WHEN a=1 THEN 'one'
   WHEN a=2 THEN 'two'
   WHEN a=3 THEN 'three'
   ELSE 'zero'
END

2.3 Los het probleem op met behulp van de CASE-instructie

Laten we een interessante vraag opschrijven. Vergeet niet dat we een taak hadden - om het woord "VERLOPEN!" naar de naam van taken uit het verleden in de taaktabel . Dat kan eenvoudig met de CASE.

Voor het veld deadline ziet het eruit als de tweede versie van de verklaring CASE:


CASE
	WHEN deadline < CURDATE() THEN CONCAT('EXPIRED!', name)
	ELSE name
END
        

Een voorbeeld van een volledige zoekopdracht met de operator CASE:


SELECT
    id,
    emploee_id,
    CASE WHEN deadline < CURDATE() THEN CONCAT('EXPIRED!', name) ELSE name END AS name,
    deadline         	
FROM task
        

Het resultaat van deze query zal zijn:

ID kaart medewerker_id naam deadline
1 1 VERLOPEN! Los een bug op de frontend op 01-06-2022
2 2 Los een bug op de backend op 2022-06-15
3 5 Koop koffie 01-07-2022
4 5 Koop koffie 01-08-2022
5 5 Koop koffie 01-09-2022
6 (NUL) Ruim het kantoor op (NUL)
7 4 Geniet van het leven (NUL)
8 6 Geniet van het leven (NUL)