Case (MySQL)
Case biedt een vorm van flow control. Deze komt in twee smaken:
- Case expressie of functie
- Case statement.
Zie pagina Programmeren (algemeen) voor het onderscheid tussen deze twee.
Merk verder op dat de bronnen meestal spreken van case terwijl je in de praktijk meestal select case ziet. Dat komt, omdat je in de praktijk de uitkomst van een case-expressie gebruikt binnen een select-statement.
Voorbeeld case-expressie met gescheiden argumenten
Dit voorbeeld sluit aan bij het eerste voorbeeld op de help-paginavan MySQL:
set @var=3; select case @var when 1 then 'one' when 2 then 'two' else 'more' end
Details:
- De twee argumenten die worden vergeleken, zijn hier gesplitst: Het eerste argument wordt direct genoemd achter het keyword case, terwijl de vergelijkende argumenten verderop staan. Hieronder staat een voorbeeld met een iets andere syntaxis
- Het voorbeeld op de helppagina gebruikt twee vaste getallen, en da's nogal simpel. Vandaar dat ik er hier een variabele van heb gemaakt.
Voorbeeld case-expressie met samengevoegde argumenten
Hetzelfde voorbeeld als hierboven, maar nu op een manier die voor mij iets herkenbaarder overkomt:
#################################################################### # Voorbeeld case-expressie met samengevoegde arguenten #################################################################### # set @var=3; select case when @var = 1 then 'one' when @var = 2 then 'two' else 'more' end;
Case-expressie zonder select
Hieraan kun je goed zien dat case een expressie is, en geen statement:
#################################################################### # Voorbeeld concat ipv. select #################################################################### # set @var=3; select concat ( "De waarde van de variabele: ", case when @var = 1 then 'one' when @var = 2 then 'two' else 'more' end ) as uitkomst;
Real-world case-expressie
Weinig nieuws, wel heel koel:
( select case when stop=0 and spring=0 and cable=0 and conn=0 then "" when stop=0 and spring=0 and cable=0 and conn=1 then " - Mit Stecker" when stop=0 and spring=0 and cable=1 and conn=0 then " - Mit Kabel" when stop=0 and spring=1 and cable=0 and conn=0 then " - Mit Federn" when stop=0 and spring=0 and cable=1 and conn=1 then " - Mit Kabel und Stecker" when stop=0 and spring=1 and cable=0 and conn=0 then " - Mit Federn" when stop=0 and spring=1 and cable=0 and conn=1 then " - Mit Federn und Stecker" when stop=0 and spring=1 and cable=1 and conn=0 then " - Mit Federn und Kabel" when stop=0 and spring=1 and cable=1 and conn=1 then " - Mit Federn, K. und S." end ) as "extra_uitleg"
Voorbeelden case-statement
Het case-statement kan alleen gebruikt worden binnen sprocs. De verschillen met de expressie:
- Het statement eindigt met end case ipv. alleen end
- Omdat dit een statement is, en geen expressie, kun je meerdere commando's incorporeren. Elk commando eindigt met een ";".
CREATE DEFINER=`root`@`localhost` PROCEDURE `case_voorbeelden`() BEGIN set @var=3; case when @var=1 then select "Eerste statement"; select "De waarde is één"; when @var=2 then select "Eerste statement"; select "De waarde is twee"; else select "Derde statement"; select "De waarde is meer dan twee"; end case; END
Case-statement & no-match
Dit is de oplossing: Gebruik ELSE icm. een lege begin & end [1]
case when in_production then # Do something useful ##################### # set in_field_length=5; else # Empty clause ############## # begin end; end case;