WHERE

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Die WHERE-Anweisung ist eine Deklarationsanweisung zur Selektion von Beobachtungen aus einer SAS-Tabelle (Data Set). Sie kann sowohl im Datenschritt (Data Step) als auch im Prozedurschritt (Proc Step) verwendet werden und arbeitet genauso wie die WHERE-Tabellenoption (Data Set Option), die sich lediglich in der Syntax geringfügig unterscheidet.

Syntax

WHERE Bedingung;     * Anweisung;
WHERE=(Bedingung)   /* Tabellenoption */

Bedingung steht für eine beliebige Bedingung zur Auswahl der Beobachtungen. Es werden ausschließlich diejenigen Beobachtungen aus der SAS Tabelle herausgefiltert, welche die Bedingung erfüllen.

Beispiele

DATA jungs;
 SET sashelp.class;
 WHERE sex="M";
RUN;
PROC PRINT DATA=sashelp.class;
 WHERE sex="M" and age>14;
RUN;
DATA a;
 SET 
  tab1 (WHERE=(x>100))
  tab2 (WHERE=(y>100))
  ;
RUN;

Details

Eine WHERE-Bedingung kann im Datenschritt nur in Verbindung mit den Anweisungen SET, MERGE, MODIFY oder UPDATE verwendet werden. Wie bei einem View auf die Tabelle(n) werden nicht alle Daten eingelesen, sondern nur diejenigen Beobachtungen, welche die Selektionsbedingung erfüllen. Falls mehrere Tabellen im Datenschritt gelesen werden, gilt die WHERE-Anweisung für sämtliche Tabellen gleichermaßen, während mittels der WHERE-Tabellenoption spezifische Selektionsbedingungen möglich sind.

Die Daten werden beim Lesen der Tabelle über die Bedingung vorgefiltert, indem außerhalb des Datenschritts bzw. Prozedurschritts ein temporäres Subset gebildet wird. Die Selektion findet also *vor* dem Einlesen der Daten in den eigentlichen Datenschritt statt und ist besonders bei großen Tabellen sehr effizient. Als Folge davon können temporäre Variablen wie _N_, FIRST- und LAST-Variablen nicht in einer WHERE-Bedingung verwendet werden, weil sie zum Zeitpunkt der WHERE Selektion noch nicht vorhanden sind. Aus demselben Grund ist im Datenschritt nur eine einzige WHERE-Bedingung zulässig.

Im Gegensatz dazu wird ein Subsetting IF im Datenschritt erst in der Impliziten Do-Schleife ausgeführt, wenn sämtliche Variablen einer Beobachtung in den Program Data Vector (PDV) eingelesen sind. Dies ist unabhängig davon wie die Daten eingelesen wurden, also unabhängig von SET, MERGE etc. und kann mehrmals hintereinander und auch mit temporären Variablen verwendet werden. Bei Tabellen mit sehr vielen Beobachtungen und Variablen wird eine WHERE-Bedingung effizienter und schneller abgearbeitet als ein Subsetting IF. Siehe Vergleich WHERE mit Subsetting IF.

In WHERE-Bedingungen können zusätzlich zu den normalen Operatoren spezielle SQL-Operatoren verwendet werden.

Operator Bedeutung Beispiel
IS MISSING
IS NULL
Missing Value (bei numerischen und alphanumerischen Variablen) WHERE name IS MISSING;
BETWEEN ... AND Liegt zwischen ... (einschließlich der Grenzen) WHERE age BETWEEN 10 AND 20;
= WHERE 10<=age<=20;
CONTAINS
 ?
Enthält WHERE name CONTAINS "ü"; findet alle Namen, die 'ü' enthalten
LIKE Abfrage mit Joker-Zeichen
 % für beliebige Anzahl wie * in DOS
_ für genau ein Zeichen wie ? in DOS
WHERE name LIKE "Sch%z"; findet Schulz, Schultz, Scholz
WHERE name LIKE "Sch_lz"; findet Schulz, Scholz
=* Sounds like (nutzt phonetische Äquivalente nach dem SOUNDEX-Algorithmus,
der besonders für die Englische Sprache geeignet ist und die Vokale ausblendet).
WHERE name=*"Schulz";
findet Schulz, Schulze, Scholz, Schalk nicht aber Schultz, Schulzer

Vergleich WHERE mit Subsetting IF

Anwendung WHERE Subsetting IF
Deklarationsanweisung (declaravive statement) X
Ausführbare Anweisung (executive statement) X
Prozedurschritt (PROC STEP) X
Datenschritt (DATA STEP) X X
Temporäre Variablen wie _N_, FIRST- und LAST-Variablen X
Spezielle SQL-Operatoren wie LIKE X
Vorselektion der Beobachtungen einer Tabelle (subset)
beim Lesen mit SET, MERGE, UPDATE oder MODIFY
X
Ausführung der Bedingung im PDV (program data vector) im Datenschritt X
Effizient bei Tabellen mit sehr vielen Beobachtungen und Variablen X
Position der Anweisung im SAS Code ist entscheidend X
Mehrfache Verwendung ist möglich X

Siehe auch

Weblinks