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

WHERE 句は、SELECT 命令と同様に OPEN CURSORUPDATE、および DELETE 命令でも使用されます。WHERE 句の標準形式は以下のとおりです。

SELECT... WHERE cond...

WHERE 句の cond 条件は、比較または一連の他の特殊式です。一連の条件を、WHERE 句の単一の条件に結合することができます。条件が動的にプログラミングされる場合もあります。

WHERE 句の条件 cond は論理式に似ていますが、構文とセマンティクスが Standard SQL に従うため、論理式と同一ではありません。WHERE 句の条件では、SELECT 句のように項目名を使用して列の名称を指定します。以下の説明では、s は常に、FROM 句で指定された 1 つのデータベーステーブルの列を表します。条件の結果は、真、偽、不明のいずれかとなります。行は、その条件が真の場合にのみ選択されます。関連する列の 1 つにヌル値が含まれている場合、条件は不明です。

全タイプの比較

任意のデータ型の列の値を他の値と比較するには、以下を使用します。

SELECT... WHERE s operator f...

f は、FROM 句からのデータベーステーブルの他の列、データオブジェクト、またはスカラサブクエリです。

列の集計には、以下の命令を使用することができます。

命令 内容説明
MAX 列の最大値
MIN 列の最小値
AVG 列の平均
SUM 列の合計
COUTN 値または行のカウント

関係演算子には、以下の式を使用することができます。

演算子

意味

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 の値がデータオブジェクト のパターンに適合する [適合しない] 場合、条件は真です。このテストは、テキスト項目に対してのみ使用することができます。列のデータ型は英数字でなければなりません。f はデータ型 でなければなりません。

以下のワイルドカードを f で使用することができます。

●     % は任意文字の順序 (スペースを含む) を表します。

●     _ は 1 文字を表します。

たとえば、ABC_EFG% は文字列ABCxEFGxyz および ABCxEFG に適合しますが、ABCEFGxyz には適合しません。2 つのワイルドカード文字を比較で明示的に使用する場合は、ESCAPE オプションを使用します。ESCAPE h は、エスケープシンボル h を指定します。h が先頭にあると、ワイルドカードとエスケープシンボル自体はパターン f 内での通常の機能を失います。_ および % の使用方法は、Standard 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 条件で選択テーブルをチェックすることはできません。

null 値のチェック

列の値がヌルであるかどうかを確認するには、以下を使用します。

SELECT... WHERE s IS [NOT]NULL...

の値がヌルである [ない] 場合、条件は真です。

条件の否定

条件の結果を否定するには、以下を使用します。

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 の行に書き込むことができます。ただし、リテラルのみを使用して、データオブジェクトの名称は使用しないでください。内部テーブル 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 に使用される各項目は、比較対象のデータベースの列と互換性がなければなりません。内部テーブル項目を使用する比較では、演算子 LIKEBETWEEN および IN を使用しないでください。同じ SELECT 命令では、ORDER BY 句を使用することはできません。

オプション FOR ALL ENTRIES を使用して、ネストされた select ループを内部テーブルでの操作によって置き換えることができます。これにより、選択したデータの大型セットに対するパフォーマンスが大幅に向上します。

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 の 1 つがある場合、この条件は真です。

... WHERE city NOT IN ('FRANKFURT', 'ROM').

列 CITY に値 FRANKFURT または ROME が含まれない場合、この条件は真です。

... .......WHERE ( NUMBER = '0001' OR NUMBER = '0002') AND

列 NUMBER に値 0001 または 0002 が含まれて、列 COUNTRY に F も USA も含まれない場合、この条件は真です。

一般サンプル

SELECT *
INTO TABLE itab
FROM spfli
WHERE col1 = wa1
AND col2 <> wa2
AND col3 IN seltab. // 選択テーブルの場合

  

動的条件

REPORT demo_select_dynamic_conditions.

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 の内容を示しています。完全に一致するテーブル行が選択されます。

テーブル条件

REPORT demo_select_for_all_entries_1.

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 が含まれている

テーブル条件

REPORT demo_select_for_all_entries_2.

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

内部テーブルを指定する(INTO TABLE)

SELECT *
INTO TABLE itab
FROM spfli.

既存内部テーブルに新規行を追加する(APPENDING)

SELECT *
INTO APPENDING [CORRESPONDING FIELD] TABLE itab
FROM spfli.

CORRESPONDING FIELDの使用はオススメしません。
項目などを自動で判別して格納してくれる一見便利そうな機能ですが、その分処理には時間がかかります。
項目の並び順が処理毎に変わらないない限り、取得項目と格納先項目の順番などを合わせて使用しない事をオススメします。

レコードを1件のみ取得する(SINGLE)

SELECT SINGLE *
INTO TABLE itab
FROM spfli.

他にも、「UP TO 1 ROWS」でも1件のみ取得することができます。
両者の違いについては、下記の比較表にまとめました

SINGLE 比較内容 UP TO 1 ROWS
最初にヒットした1件 取得方法 全レコードを確認して条件に合う最初の1件
高い パフォーマンス 低い
少ない バッファ使用量 多い
全て含む場合に使用 検索条件に主キー(推奨) 一部のみの場合に使用
保証されている(マスタなど) データの存在(推奨) 保証されていない

(推奨)は、基本的な考え方の一例です。

テーブルの名称を静的に指定する(AS)

SELECT col1 col2
INTO table itab
FROM spfli1 AS s1
JOIN spfli2 AS s2 ON s1~col1 = s2~col2.

  

全ての列を取得する(*)

全件取得する必要がない限りは個別に項目を指定する事をオススメします。

SELECT *
INTO wa
FROM spfli.

  

列の最大値を取得する(MAX)

SELECT MAX(col)
INTO wa
FROM spfli.

  

列の最小値を取得する(MIN)

SELECT MIN(col)
INTO wa
FROM spfli.

  

列の平均を取得する(AVG)

SELECT AVG(col)
INTO wa
FROM spfli.

  

値または行のカウントを取得する(COUNT)

SELECT COUNT(*)
INTO wa
FROM spfli.

  

  

参照資料: 

 SAP SELECT行の選択

 SAP公式サイト(データ読込み)

SELECT(データ取得)的更多相关文章

  1. 最全的ORACLE-SQL笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...

  2. Matplotlib数据可视化(6):饼图与箱线图

    In [1]: from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParam ...

  3. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

    Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...

  4. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

  5. LINQ to SQL Select查询

    1. 查询所有字段 using (NorthwindEntities context = new NorthwindEntities()) { var order = from n in contex ...

  6. ADO.NET一小记-select top 参数问题

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 最近使用ADO.NET的时候,发现select top @count xxxx 不 ...

  7. iosselect:一个js picker项目,在H5中实现IOS的select下拉框效果

    具体文档和demo可以访问github:https://github.com/zhoushengmufc/iosselect 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的pi ...

  8. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  9. (转载) Linux IO模式及 select、poll、epoll详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...

  10. 基于select的python聊天室程序

    python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...

随机推荐

  1. 扫描FTP,保存文件

    1.需求:某公司ftp服务器中一个文件夹中有30个文件(文件名字是不同的),每五分钟产生一个新的文件,同时删除这三十个文件中最早产生的文件,该文件夹中始终保持30个文件. 现在需要采集一周的数据做研究 ...

  2. Ubuntu 配置java环境变量

    1.使用如下命令,打开/etc/profile: $sudo vi /etc/profile 2.进入编辑模式,在末尾添加: #developer enviroment, add by myself ...

  3. c++利用互斥锁实现读写锁

    很简单就是在读的时候把写的锁锁住就好了 class readwrite_lock { public: readwrite_lock() : read_cnt(0) { } void readLock( ...

  4. public /protected/private的作用域

    作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × ×

  5. 使用Vue做评论+localStorage存储(js模块化)

    未分模块化 html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  6. js 跳转整理

    js方式的页面跳转1.window.location.href方式    <script language="javascript" type="text/java ...

  7. Android学习笔记_53_Android界面的基本属性

    很好很全面http://www.eoeandroid.com/forum.php?mod=viewthread&tid=46859 布局: 在 android 中我们常用的布局方式有这么几种: ...

  8. asp.net mvc Post上传文件大小限制 (转载)

    最近发现在项目中使用jQuery.form插件上传比较大的文件时,上传不了,于是改了下web.config的上传文件最大限制. <configuration> <system.web ...

  9. C#中对于float,double,decimal的误解(转载)

    浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit sin ...

  10. 数据库——MySQL——多表查询

    这里多表,为了方便我只建了两张表,更复杂的表间也就是这些东西,就是复杂程度不一样. 数据源准备 建立一个学生表,和一个班级表 # 建立学生表 create table student( id int ...