Pour dire à SAS quelles actions sont à mener si des critères sont remplis, nous avons vu la syntaxe IF/THEN/ELSE (voir article). Dans un data step, l’alternative à cette syntaxe, SELECT WHEN, fait l’objet du présent article.
1. La syntaxe de base
Toutes les conditions sont englobées entre l’instruction SELECT et l’instruction END. Chaque condition est introduite par l’instruction WHEN. Les observations non sélectionnées avant la fin sont traités par l’instruction OTHERWISE.
A la différence de la syntaxe IF/THEN :
- Les conditions sont listées entre parenthèses et aucun mot-clé n’introduit l’action.
- Si toutes les conditions se basent sur une seule variable, celle-ci peut-être citée une seule fois et ce en tout début dans l’instruction SELECT. Mais il faut aussi que les valeurs prises par la variable soient toutes listées. Ainsi <5 ne marche pas mais 0,1,2,3,4 marche.
De la même manière que IF/THEN :
- Seuls les records non sélectionnés pas un précédent WHEN sont considérées par les conditions suivantes. C’est le même principe que le ELSE IF.
- Si plusieurs actions sont planifiées, celles-ci sont listées entre un DO et un END.
select <nom_variable, optionnel> ;
when (<condition>)
do;
<action 1>;
<action 2>;
*etc;
end;
when (<condition>) <action>;
otherwise <action>;
end;
2. Le caractère unique du SELECT WHEN
Pas d’action s’il vous plaît : Lorsqu’il n’y a aucune action pour une condition donnée, il est possible d’écrire une instruction WHEN sans donner de détails après la parenthèse. On parle d’instruction nulle.
OTHERWISE est parfois obligatoire : Si aucune condition n’est rempli pour un data set donné, il est important d’avoir une instruction OTHERWISE. Celle-ci peut rester vide d’action.
3. Illustration par un exemple
Premier exemple : les trois caractéristiques de ce premier exemple sont les suivantes.
- La condition est basée sur une seule variable. On choisit dont de nommer une seule fois cette variable dans l’instruction SELECT.
- Il y a plusieurs actions (DO/END) pour certaines conditions.
- Dans le cas où aucune des conditions précédentes ne serait remplie, l’instruction OTHERWISE est ajoutée.
Les records incluant un âge manquant sont sauvegardées dans le data set nommé MISS_AGE et la date de création d’une requête (query) pour clarifier le record est ajoutée dans une variable QUERY_SDT (Query Starting Date). Les autres records, traitant des moins de 5 ans, sont sauvegardés dans le data set YOUNG.
data miss_age young ;
set sashelp.class;
select (age);
when (.)
do;
query_sdt=mdy(3,26,2008);
output miss_age;
end;
when (0,1,2,3,4) output young;
otherwise;
end;
run;
Second exemple : cet exemple se distingue sur trois aspects.
- La condition est basée sur plusieurs variables. Il faut dont les lister à chaque nouvelle instruction WHEN.
- Une seule action n’est donnée à chaque fois voir moins. L’action porte sur la valeur de la variable POP. Il n’y a pas d’action quand l’âge n’est pas une valeur connue ou que le sexe n’est pas défini par les lettres majuscules F (female) ou M (male).
- Les valeurs restantes se rapportent aux hommes ayant une valeur pour leur âge. C’est notre troisième population.
data pop;
set sashelp.class;
select;
when (age > 13 and sex=‘F’) pop = 1;
when (age >= 0 and sex=‘F’) pop = 2;
when (age < 0 or sex not in (‘F’,‘M’));
otherwise pop = 3;
end;
run;
A dans huit jours pour une présentation du CASE WHEN de la procédure SQL.