Vergleich Konstante mit mehreren Variablen
Ich möchte in einem Programm einen Vergleich im Stil des IN Operators machen, nur dass die Menge der zu vergleichenden Werte keine Konstanten sind, sondern Variablen.
In der Logik sollte es folgendermaßen funktionieren:
if 100 in (A,B,C,D,E) then text = "Mindestens ein Wert ist 100.";
Mit IN geht das aber leider nicht, weil in der Klammer nur Konstanten erwartet werden, aber keine Variablen. Bleibt mir nur die umständliche Möglichkeit, jede Variable einzeln mit OR abzufragen, also:
if A = 100 or B = 100 or C = 100 .......;
Dies ist aber sehr mühsam und auch unschön, weil ich sehr viele Variablen habe.
Ein ähnliches Problem habe ich mit AND, wo ich auch gerne eine elegante Alternative suche zu:
if A = 100 and B = 100 and C = 100 .....;
Für Tipps wäre ich dankbar. Vielen Dank im Voraus.
- Anmelden oder Registrieren um Kommentare zu schreiben

Macro in
Hallo,
wie würde diese Lösung gefallen?
%let i =1;
%do %while(%scan(&variablen,&i,%str( )) ne );
%if &i ne 1 %then
&vergleich ;
&funktion %scan(&variablen,&i,%str( ))
%let i = %eval(&i +1);
%end;
%mend;
funktion: gibt die Operation an, wobei die Variable immer rechts steht.
variablen: gibt die zu bearbeitenden Variablen an, mit space getrennt.
vergleich: gibt den Vergleichoperator an (and, or...)
Beispiel:
a=0;
b=0;
c=1;
if %in(funktion=1 eq, variablen=a b c, vergleich=or) then
put 'mindestens eine Variable 1';
run;
Natürlich sollten einige Fehler abgefangen werden, wenn man das Macro regelmäßig verwenden will.
Gruß Guido
Dreckige Lösung, die aber mit allen Variablenlisten funktionier
Obige Lösung funktioniert ja leider nur, wenn man alle Variablen einzeln aufzählt, nicht aber, wenn man Variablenlisten der Art "prefix:" oder "x1-x100" angeben können will.
Folgendes funktioniert mit jeder Art von Variablenlisten, ist aber etwas "dreckig", da es implizit eine Umwandlung in Character vornimmt.
Als Bedingung schreibt man einfach:
index( ";"||catx(";",ofmeine_variablenliste)||";" , cats(";",Suchwert,";") )Das kann man natürlich in ein Makro verpacken:
index( ";"||catx(";", of &varlist)||";" , cats(";",&num,";") )
%mend;
und wie folgt verwenden:
a1=1000; a2=100; a3=100.1; a4=0.1001; a5=1010010;
if %num_in_varlist(100, a:) then put "100 kommt in a1-a5 vor!";
if %num_in_varlist(100, a2-a5 a2) then put "100 kommt in a2-a5 a2 vor!";
if not %num_in_varlist(100, a1 a3--a5) then put "100 kommt nicht in a1 a3--a5 vor!";
run;