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.

Macro in

Hallo,
wie würde diese Lösung gefallen?

%macro in(funktion= ,variablen= , vergleich= );
    
%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:

data _null_;
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(";",of meine_variablenliste )||";" , cats(";",Suchwert,";") )

Das kann man natürlich in ein Makro verpacken:

%macro num_in_varlist(num,varlist);
  index(
";"||catx(";", of &varlist)||";" , cats(";",&num,";") )
%mend;

und wie folgt verwenden:

data test;
  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;