!--a11y-->

WHERE 句は、満たす必要のある条件を指定することにより選択される行の数を制限します。
WHERE 句は、SELECT 命令だけでなく OPEN CURSOR 、UPDATE 、DELETE 命令でも使用されます。WHERE 句の標準形式は以下のとおりです。
SELECT ... WHERE <cond> ...
WHERE 句の <cond> 条件は、比較または一連の他の特殊式です。一連の条件を単一の条件に結合することができます。また、条件は動的にプログラムすることもできます。
WHERE 句の条件 <cond> は論理式に似ていますが、構文やセマンティックは標準 SQL に従うため論理式と同一ではありません。WHERE 句の条件では、SELECT 句のように項目名を使用して列の名前を付けます。以下の説明では、<s> は常に、FROM 句で名づけられた 1 つのデータベーステーブルの列を表します。条件の結果は、真、偽、または不明のいずれかになります。行は、条件が真である場合のみ選択されます。関係する列のうち 1 つにヌル値が含まれる場合は、条件は不明です。
任意のデータ型の列の値を他の値と比較するには、以下を使用します。
SELECT ...WHERE <s> < 演算子> <f> ...
<f> は、FROM 句からのデータベーステーブルの他の列、データオブジェクト、またはスカラサブクエリです。
関係演算子には以下のデータ型を使用することができます。
|
< 演算子> |
意味 |
|
EQ |
等しい |
|
= |
等しい |
|
NE |
等しくない |
|
<> |
等しくない |
|
>< |
等しくない |
|
LT |
より小さい |
|
< |
より小さい |
|
LE |
より小さいまたは等しい |
|
<= |
より小さいまたは等しい |
|
GT |
より大きい |
|
> |
より大きい |
|
GE |
より大きいまたは等しい |
|
>= |
より大きいまたは等しい |
必要に応じて、オペランドの値は変換されます。変換はプラットフォームおよびコードページに依存することがあります。
列の値が特定の間隔内にあるかどうかを確認するには、以下を使用します。
SELECT ... WHERE <s> [NOT ]BETWEEN <f1> AND <f2> ...
列の値 <s> が、データオブジェクトの値<f1> および <f2> の間にある [ ない] 場合、条件は真です。FROM 句の ON 条件で BETWEEN を使用することはできません。
列の値がパターンに適合するかどうかを確認するには、以下を使用します。
SELECT ...WHERE <s> [NOT ]LIKE <f> [ESCAPE <h>] ...
列の値 <s> が、データオブジェクトのパターン<f1> に適合する [ 適合しない] 場合、条件は真です。このテストはテキスト項目に対してのみ使用することができます。列のデータ型はテキストでなければなりません。<f> はデータ型 C で なければなりません。
以下のワイルドカードを <f> で使用することができます。
キ % は任意の文字列 ( スペースを含む) を表します。
キ _ は任意の 1 文字を表します。
たとえば、ABC_EFG% は文字列 ABCxEFGxyz および ABCxEFG と一致しますが、ABCEFGxyz とは一致しません。比較において 2 つのワイルドカードを明示的に使用する場合は、ESCAPE オプションを使用します。ESCAPE <h> はエスケープシンボル <h> を指定します。先頭に <h> があると、ワイルドカードおよびエスケープシンボル自体は、パターン <f> 内での通常の機能を失います。_ および % の使用方法は、標準 SQL での使用方法と一致しています。ABAP の他の箇所での論理式は、その他のワイルドカード (+ および *) を使用します。
FROM 句の ON 条件で LIKE を使用することはできません。
列の値が値一覧に含まれているかどうかを確認するには、以下を使用します。
SELECT ...WHERE <s> [NOT ]IN (<f1>, ......, <fn>) ...
列の値<s> が一覧 <f1> ... <fn> にある [ ない] 場合、条件は真です。
列の値がスカラサブクエリに含まれているかどうかを確認するには、以下を使用します。
SELECT ...WHERE <s> [NOT ]IN <subquery> ...
値 <s> が、スカラサブクエリ<subquery> の結果セットに含まれている [ いない] 場合、条件は真です。
サブクエリの選択に行が 1 つでも含まれているかどうかを確認するには、以下を使用します。
SELECT ...WHERE [NOT ]EXISTS <subquery> ...
サブクエリ <subquery> の結果セットに少なくとも1 つの行が含まれている [1 つも含まれていない] 場合、この条件は真です。サブクエリがスカラである必要はありません。
FROM 句の ON 条件でサブクエリをチェックすることはできません。
列の値が選択テーブルの条件を満たすかどうかを確認するには、以下を使用します。
SELECT ...WHERE <s> [NOT ]IN <seltab> ...
値 <s> が<seltab> に保存された条件を満たす [ 満たさない] 場合、条件は真です。<seltab> は、実際の選択テーブルまたは RANGES テーブルです。FROM 句の ON 条件で選択テーブルをチェックすることはできません。
列の値がヌルかどうかを確認するには、以下を使用します。
SELECT ...WHERE <s> IS [NOT ]NULL ...
値 <s> がヌルである [ ではない] 場合、条件は真です。
条件の結果を否定するには、以下を使用します。
SELECT ...WHERE NOT <cond> ...
<cond> が偽の場合は条件が真、<cond> が真の場合は条件が偽です。不明の条件の結果は、否定された時も不明のままです。
AND および OR 演算子を使用して、2 つの条件を 1 つに結合することができます。
SELECT ...WHERE <cond1> AND <cond2> ...
<cond1> および <cond2> が真の場合、この条件は真です。
SELECT ...WHERE <cond1> OR <cond2> ...
<cond1> および <cond2> のいずれかまたは両者が真の場合、この条件は真です。
NOT は AND に優先し、AND は OR に優先します。しかし、括弧を使用して処理順序を制御することもできます。
条件を動的に指定するには、以下を使用します。
SELECT ... WHERE (<itab>) ...
ここで、<itab> は行データ型 C で最大桁数 72 文字の内部テーブルです。選択テーブル以外の上記の条件はすべて <itab> の行に書き込まれます。ただし、リテラルだけを使用し、データオブジェクトの名称は使用しないでください。内部テーブルも空白のままになることがあります。
条件の一部だけを動的に指定するには、以下を使用します。
SELECT ... WHERE <cond> AND (<itab>) ...
OR を使用して静的条件と動的条件をリンクすることはできません。
SELECT 命令の WHERE 句でだけ動的条件を使用します。
SELECT 命令の WHERE 句には特殊バリアントがあり、内部テーブルの行および列から条件を導くことができます。
SELECT ...FOR ALL ENTRIES IN <itab> WHERE <cond> ...
<cond> は前述の方法で指定します。内部テーブル <itab> の項目を、条件のオペランドとして指定する場合は、内部テーブルのすべての行をアドレス指定します。その後で、内部テーブルの各行に対して比較が実行されます。各行に対して、条件を満たすデータベーステーブルからの行を選択します。SELECT 命令の結果セットは、内部テーブルの各行に対する個々の選択を結合したものです。重複する行は自動的に結果セットから除外されます。<itab> が空白の場合、オプション FOR ALL ENTRIES が無視され、すべてのエントリが読み込まれます。
内部テーブル <itab> には構造化された行データ型が必要であり、条件 <cond> に登場する各項目は、比較対象のデータベースの列と互換性がなければなりません。内部テーブル項目を使用する比較では、演算子 LIKE 、BETWEEN 、IN を使用しないでください。同じ SELECT 命令では ORDER BY 句を使用しません。
オプション FOR ALL ENTRIES を使用して、ネストされた選択ループを内部テーブルでの操作で置き換えます。これにより、選択したデータの多数のセットに対するパフォーマンスが大幅に向上します。

WHERE 句の条件:
... WHERE CARRID = 'UA'.
列 CARRID にコンテンツ UA がある場合、この条件は真です。
... WHERE NUM GE 15.
列 NUM の数値が 15 以上の場合、この条件は真です。
... WHERE CITYFROM NE 'FRANKFURT'.
列 CITYFROM に文字列 FRANKFURT が含まれない場合、この条件は真です。
... WHERE NUM BETWEEN 15 AND 45.
列 NUM の数値が 15 から 45 までの数値の場合、この条件は真です。
... WHERE NUM NOT BETWEEN 1 AND 99.
列 NUM の数値が 1 から 99 までの数値ではない場合、この条件は真です。
... WHERE NAME NOT BETWEEN 'A' AND 'H'.
列 NAME が 1 文字の長さで、コンテンツが A から H ではない場合、この条件は真です。
... WHERE CITY LIKE '%town%'.
列 CITY にパターン ‘town’ を含む文字列がある場合、この条件は真です。
... WHERE NAME NOT LIKE '_n%'.
列 NAME に、2 番目の文字が ‘n’ ではない値がある場合、この条件は真です。
... WHERE FUNCNAME LIKE 'EDIT#_%' ESCAPE '#'.
列 FUNCNAME のコンテンツが EDIT_ で始まる場合、この条件は真です。
... WHERE CITY IN ('BERLIN', 'NEW YORK', 'LONDON').
列 CITY に値 BERLIN 、NEW YORK 、LONDON のいずれかが含まれる場合、この条件は真です。
... WHERE CITY NOT IN ('FRANKFURT', 'ROME').
列 CITY に値 FRANKFURT または ROME が含まれない場合、この条件は真です。
...
WHERE ( NUMBER = '0001' OR NUMBER
= '0002') AND
NOT ( COUNTRY = 'F' OR COUNTRY =
'USA').
列 NUMBER に値 0001 または 0002 が含まれ、列 COUNTRY に F も USA も含まれない場合、この条件は真です。

動的条件
DATA: COND(72) TYPE
C,
ITAB LIKE TABLE OF COND.
PARAMETERS: CITY1(10) TYPE C, CITY2(10) TYPE C.
DATA WA TYPE SPFLI-CITYFROM.
CONCATENATE 'CITYFROM = ''' CITY1 '''' INTO COND.
APPEND COND TO ITAB.
CONCATENATE 'OR CITYFROM = ''' CITY2 '''' INTO COND.
APPEND COND TO ITAB.
CONCATENATE 'OR CITYFROM = ''' 'BERLIN' '''' INTO COND.
APPEND COND TO ITAB.
LOOP AT ITAB INTO COND.
WRITE COND.
ENDLOOP.
SKIP.
SELECT CITYFROM
INTO WA
FROM SPFLI
WHERE (ITAB).
WRITE / WA.
ENDSELECT.
選択画面で、パラメータ CITY1
および CITY2
に FRANKFURT
および BERLIN
と入力した場合、以下のような一覧が表示されます。
最初の 3 行は内部テーブル ITAB の内容を示しています。完全に一致しているテーブル行が選択されています。

テーブル条件
DATA: BEGIN OF LINE,
CARRID TYPE
SPFLI-CARRID,
CONNID TYPE
SPFLI-CONNID,
CITYFROM TYPE
SPFLI-CITYFROM,
CITYTO TYPE
SPFLI-CITYTO,
END OF LINE,
ITAB LIKE TABLE OF LINE.
LINE-CITYFROM =
'FRANKFURT'.
LINE-CITYTO =
'BERLIN'.
APPEND LINE TO
ITAB.
LINE-CITYFROM = 'NEW
YORK'.
LINE-CITYTO =
'SAN FRANCISCO'.
APPEND LINE TO
ITAB.
SELECT CARRID CONNID
CITYFROM CITYTO
INTO CORRESPONDING FIELDS OF LINE
FROM SPFLI
FOR ALL ENTRIES IN ITAB
WHERE CITYFROM = ITAB-CITYFROM AND CITYTO =
ITAB-CITYTO.
WRITE: / LINE-CARRID, LINE-CONNID, LINE-CITYFROM, LINE-CITYTO.
ENDSELECT.
出力結果は以下のとおりです。

この例では、以下の条件を満たすすべての行が選択されます。
キ CITYFROM 列に FRANKFURT が、CITYTO 列に BERLIN が含まれる
キ CITYFROM 列に NEW YORK が、CITYTO 列に SAN FRANCISCO が含まれる

テーブル条件
DATA: TAB_SPFLI TYPE TABLE OF
SPFLI,
TAB_SFLIGHT TYPE SORTED TABLE OF
SFLIGHT
WITH UNIQUE KEY TABLE LINE,
WA LIKE LINE OF
TAB_SFLIGHT.
SELECT CARRID CONNID
INTO CORRESPONDING FIELDS OF TABLE TAB_SPFLI
FROM SPFLI
WHERE CITYFROM = 'NEW YORK'.
SELECT CARRID CONNID
FLDATE
INTO CORRESPONDING FIELDS OF TABLE TAB_SFLIGHT
FROM SFLIGHT
FOR ALL ENTRIES IN TAB_SPFLI
WHERE CARRID = TAB_SPFLI-CARRID AND
CONNID = TAB_SPFLI-CONNID.
LOOP AT TAB_SFLIGHT INTO WA.
AT NEW CONNID.
WRITE: / WA-CARRID, WA-CONNID.
ENDAT.
WRITE: / WA-FLDATE.
ENDLOOP.
出力結果は以下のとおりです。

この例では、テーブル SPFLI の列 CITYFROM に値 NEW YORK が含まれるすべての接続に対して、SFLIGHT からのフライトデータが選択されます。また、FROM 句の結合を使用して、単一 SELECT 命令の同じデータを選択することもできます。