前のページ|次のページ

WHEREステートメント

SASデータセットから特定の条件を満たすオブザベーションを選択します。

該当要素: DATAステップまたはPROCステップ
カテゴリ: アクション
種類: 宣言
ヒント: WHEREステートメントを使用してデータをフィルタリングする方法については、SASチュートリアルビデオデータのフィルタリングをご覧ください。

構文

引数

where-expression

オペランドや演算子で構成される算術式または論理式を指定します。

ヒント 次のいくつかのセクションで説明されるオペランドや演算子はWHERE=データセットオプションでも使用できます。
where-expressionを複数指定することができます。

logical-operator

AND、AND NOT、OR、OR NOTを指定できます。

詳細

基本

WHEREステートメントを使用すると、入力データセットからすべてのオブザベーションを読み込む必要がなくなるため、SASプログラムの処理効率が向上します。
WHEREステートメントは条件を指定して実行することはできません。そのため、IF-THENステートメントの中で使用することはできません。
WHEREステートメントには、論理演算子で連結した複数のWHERE式を指定できます。
注: WHERE式を使用してSASデータセットにあるオブザベーションのサブセットにアクセスするときに、インデックス付きのSASデータセットを使用するとパフォーマンスが大幅に向上します。WHERE式でインデックス付きデータセットを処理する方法の詳細やSASデータセットのインデックスを作成する前に考慮すべきガイドラインリストについては、XisError: No pubcode in link data found for lrconを参照してください。

DATAステップでの使用

WHEREステートメントは、直前にあるSET、MERGE、MODIFY、UPDATEの各ステートメントに指定されているすべてのデータセットに適用されます。WHEREステートメントで使用する変数は、WHEREステートメントが適用されるすべてのデータセットに含まれている必要があります。WHEREステートメントは、POINT=オプションを指定したSETステートメントやMODIFYステートメントとともに使用することはできません。
OBS=およびFIRSTOBS=の処理をWHEREステートメントの処理に適用できます。詳細については、XisError: No pubcode in link data found for lrconを参照してください。
WHEREステートメントを使用して、生データを含む外部ファイルからレコードを選択することはできません。また、DATALINESステートメントでインストリームデータを読み込むDATAステップ内にWHEREステートメントは使用できません。
DATAステップを繰り返すたびに、SET、MERGE、MODIFY、UPDATEの各ステートメントの最初の操作として、入力データセット内のオブザベーションがWHEREステートメントの条件を満たしているかどうかの確認が実行されます。入力データセットオプションの適用直後、DATAステップ内の他のステートメントを実行する前に、WHEREステートメントが適用されます。DATAステップでのオブザベーションの結合にMERGE、MODIFY、UPDATEステートメントとともにWHEREステートメントを使用する場合、各入力データセットからオブザベーションを選択した後で結合します。

DATAステップ内のWHEREステートメントとBYステートメント

DATAステップにWHEREステートメントとBYステートメントの両方が含まれている場合、BYグループを作成するにWHEREステートメントが実行されます。そのため、BYグループは、WHEREステートメントで選択したオブザベーションサブセットのオブザベーショングループを反映します。元の入力データセットのオブザベーションの現行のBYグループを反映しません。
BYグループの処理の詳細については、 XisError: No pubcode in link data found for lrconを参照してください。

PROCステップ

WHEREステートメントは、SASデータセットを読み込むSASプロシジャとともに使用できます。WHEREステートメントは、プロシジャで処理する元のデータセットをサブセット化する場合に便利です。Base SASプロシジャガイドでは、複数のデータセットの指定可能なプロシジャでのWHEREステートメントのアクションのみが説明されています。他の場合、WHEREステートメントはこのトピックで説明されているように動作します。

インデックスの使用

次の演算子と関数のいずれかと組み合わせてインデックス付き変数が使用されている場合、DATAステップまたはPROCステップは利用可能なインデックスを使用してデータの選択を最適化しようとします。
  • BETWEEN-AND演算子
  • 比較演算子(コロン修飾子あり/なし)
  • CONTAINS演算子
  • IS NULLおよびIS NOT NULL演算子
  • LIKE演算子
  • TRIM関数
  • SUBSTR関数(場合による)
SUBSTR関数には次の引数が必要です。
where substr(variable,position,length)
 ='character-string';
SUBSTR関数の引数が次のすべての条件を満たす場合、インデックスが処理に使用されます。
  • positionが1に等しい
  • lengthvariableの長さよりも短い、またはその長さに等しい
  • lengthcharacter-stringの長さに等しい

WHERE式で使用されるオペランド

WHERE式で使用されるオペランドには次の値が含まれます。
  • 定数
  • 日付と時刻の値
  • SASデータセットから取得した変数の値
  • WHERE式自身で作成された値
DATAステップで作成される変数はWHERE式で使用できません(たとえば、FIRST.variable, LAST.variable、_N_、または割り当てステートメントで作成される変数)。これは、DATAステップまたはPROCステップにオブザベーションを読み込む前にWHEREステートメントが実行されるためです。WHERE式に比較演算子が使用されている場合、フォーマットされていない変数の値が比較されます。
WHERE式でオペランドを使用する例を次に示します。
  • where score>50;
  • where date>='01jan1999'd and time>='9:00't;
  • where state='Mississippi';
他のSAS式の場合と同様に、数値変数の名前は単独で指定できます。この場合、値が0または欠損値の場合は偽になります。その他の値の場合は真になります。これらの例では、WHERE式に数値変数EMPNUMとSSNが含まれています。
  • where empnum;
  • where empnum and ssn;
WHERE式では、文字リテラルまたは文字変数の名前も単独で使用できます。WHERE式として文字変数を単独で指定した場合、文字変数の値が空ではないオブザベーションが選択されます。

WHERE式で使用される演算子

WHEREステートメントにはSAS演算子とWHERE式の特殊な演算子を使用できます。 演算子の詳細なリストについては、WHEREステートメント演算子を参照してください。WHERE式を評価するときのルールについては、XisError: No pubcode in link data found for lrconを参照してください。
WHEREステートメントの演算子を次の表に示します。
WHEREステートメント演算子
演算子の種類
記号またはニーモニック
説明
算術演算子
*
乗算
/
除算
+
加算
減算
**
累乗
比較演算子 4
= または EQ
等しい
^=、¬=、~=、またはNE1
等しくない
> または GT
より大きい
< または LT
未満
>= または GE
以上
<= または LE
以下
IN
リストのどれかと等しい
論理演算子(ブール演算子)
& または AND
論理積
| または OR2
論理和
~、^、¬、またはNOT1
論理否定
その他の演算子
||3
文字変数の連結
( )
評価の順序を示す
+ 接頭辞
正の数
− 接頭辞
負の数
WHERE式のみ
BETWEEN–AND
対象範囲
? または CONTAINS
文字列
IS NULL または IS MISSING
欠損値
LIKE
パターンマッチ
=*
類似
SAME-AND
元の句を再入力せずに、既存のWHEREステートメントに句を追加
1キャレット(^)、チルダ(~)、否定(¬ )はすべて論理否定を示しています。キーボードから文字を使用するか、対応するニーモニックを使用してください。
2OR記号( | )、破線の縦棒( | )、および感嘆符(!)はすべて論理和を示しています。キーボードから文字を使用するか、対応するニーモニックを使用してください。
32つのOR記号(| | )、2つの破線の縦棒( | | )、および2つの感嘆符(!!)は連結を示しています。キーボードから文字を使用してください。
4比較演算子とともにコロン修飾子(:)を使用すると、文字列にある指定した接頭辞のみを比較できます。

比較

  • SAS/FSPでは、編集および参照するために、WHEREコマンドを使用してデータをサブセット化できます。WHEREステートメントとWHERE=データセットオプションのどちらも、ウィンドウ環境プロシジャでは使用できます。また、WHEREコマンドと組み合わせることもできます。
  • SET、MERGE、MODIFY、UPDATEの各ステートメントで複数のデータセットを指定するときに個々のデータセットからオブザベーションを選択するには、WHERE=データセットオプションを各データセットに適用する必要があります。DATAステップ内でWHEREステートメントとWHERE=データセットオプションが同じデータセットに適用される場合、WHERE=データセットオプションが優先され、WHEREステートメントは無視されます。WHEREデータセットオプションが適用されていない他のデータセットでは、WHEREステートメントが使用されます。
  • DATAステップにおけるWHEREステートメントとサブセット化IFステートメントの重要な違いを次に示します。
    • WHEREステートメントでは、オブザベーションがプログラムデータベクトルに読み込まれるにオブザベーションを選択します。そのため、プログラムの処理効率が向上します。サブセット化IFステートメントでは、オブザベーションがプログラムデータベクトルに読み込まれた後に、オブザベーションを操作します。
    • BYステートメントがSET、MERGE、UPDATEの各ステートメントとともに使用される場合、WHEREステートメントとサブセット化IFステートメントは異なるデータセットを作成します。データセットに違いが発生するのは、サブセット化IFステートメントではオブザベーションを選択する前にBYグループが作成され、WHEREステートメントではオブザベーションを選択した後にBYグループが作成されるためです。
    • WHEREステートメントはIFステートメントの一部として条件を指定して実行できませんが、サブセット化IFステートメントは条件を指定して実行できまます。
    • WHEREステートメントでは、SASデータセットにあるオブザベーションのみを選択します。ただし、サブセット化IFステートメントでは、既存のデータセットやINPUTステートメントで作成されたオブザベーションからもオブザベーションを選択します。
    • SASウィンドウ環境プロシジャでは、サブセット化IFステートメントを使用してオブザベーションをサブセット化して、参照および参照できません。
  • WHEREステートメントをDROPまたはKEEPステートメントと混同しないでください。DROPとKEEPステートメントでは、処理対象の変数を選択します。WHEREステートメントでは、オブザベーションを選択します。

例1: WHEREステートメントの基本的な使用法

次のDATAステップでは、データセットCUSTOMERからNAMEがMacで始まり、CITYの値がCharlestonまたはAtlantaであるオブザベーションのみを含むSASデータセットを作成します。
data testmacs;
   set customer;
   where substr(name,1,3)='Mac' and
      (city='Charleston' or city='Atlanta');
run;

例2: WHEREステートメントのみで使用可能な演算子を使用する

  • BETWEEN-AND演算子の使用:
    where empnum between 500 and 1000;
  • CONTAINS演算子の例:
    where company ? 'bay';
    where company contains 'bay';
  • IS NULLおよびIS MISSING演算子の例:
    where name is null;
    where name is missing;
  • 文字Dで始まるすべての名前を選択するLIKE演算子の例:
    where name like 'D%';
  • 次の名前リストからパターンマッチを行うLIKE演算子の例:
    Diana
    Diane
    Dianna
    Dianthus
    Dyan
    WHEREステートメント
    選択される名前
    where name like 'D_an';
    Dyan
    where name like 'D_an_';
    Diana、Diane
    where name like 'D_an__';
    Dianna
    where name like 'D_an%';
    リストに含まれるすべての名前
  • SOUNDS-LIKE演算子を使用すると、“Smith”に似た名前が選択されます。
    where lastname=*'Smith';
  • SAME-ANDの使用:
    where year>1991;
    ...more SAS statements...
    where same and year<1999;
    この例にある2番目のWHEREステートメントは、次のWHEREステートメントに相当します。
    where year>1991 and year<1999;

関連項目:

Base SASプロシジャガイド
XisError: No pubcode in link data found for lrcon
SAS SQLクエリウィンドウ ユーザーガイド
SAS/IML User's Guide
XisError: No pubcode in link data found for lrcon
XisError: No pubcode in link data found for lrcon
データセットオプション:
XisError: No pubcode in link data found for ledsoptsref
前のページ|次のページ|ページの先頭へ