コンテンツフレーム起動

行の選択 文書を SAP ライブラリストラクチャに組み込む

WHERE 句は、満たす必要のある条件を指定することにより選択される行の数を制限します。

このグラフィックは添付のテキストに説明されています

WHERE 句は、SELECT 命令だけでなく OPEN CURSORUPDATEDELETE 命令でも使用されます。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> に登場する各項目は、比較対象のデータベースの列と互換性がなければなりません。内部テーブル項目を使用する比較では、演算子 LIKEBETWEENIN を使用しないでください。同じ 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 に値 BERLINNEW YORKLONDON のいずれかが含まれる場合、この条件は真です。

... 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 命令の同じデータを選択することもできます。

 

 

 

コンテンツフレーム終了