Case (MySQL)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

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;

Zie ook

Bronnen