この記事を読むメリット
ABAP7.4以降のSELECT文についての新構文を理解することができます。
ABAP7.4以降ではSELECT文の書き方がだいぶ変わり、非常に便利になりました。 ネイティブSQLで直接データベースを触れたことがある方は分かると思いますが、それと近い感覚でSQL内で演算することができるようになっています。
ここではSELECT文についての新構文を解説していくのじゃ!
※当記事ではABAP7.5以降の新構文も含みます。
・同じプログラム内で旧構文と新構文のSELECT文は同居可能です。 ・1つのSELECT文の中では旧構文もしくは新構文のどちらかで記載する必要があります。
この記事のポイント
取得項目の指定 / 変数の指定の方法の変更
・新構文では取得項目は「,」を付けて指定 します。 ・内部テーブルや条件指定時の変数には、変数の頭に「@」を付けます
旧構文
* データ取得
SELECT ebeln
bukrs
FROM ekko
INTO TABLE it_ekko
WHERE ernam = l_user.
新構文
* データ取得
SELECT ebeln,
bukrs
FROM ekko
INTO TABLE @it_ekko
WHERE ernam = @l_user.
SELECT構文(記載順序)の追加
新構文では以下のような取得の仕方も可能 となりました。 SELECT FROM テーブル名 FIELDS 項目1,項目2… WHERE 項目 = @変数 INTO TABLE @内部テーブル
旧構文
SELECT ebeln
bukrs
FROM ekko
INTO TABLE it_ekko
WHERE ernam = l_user.
新構文
SELECT FROM ekko
FIELDS ebeln,
bukrs
WHERE ernam = @l_user
INTO TABLE @it_ekko.
UNION / UNION ALLの使用が可能に
新構文では、 ・UNION / UNION ALLを用いて複数のSELECT文を一つの内部テーブルに格納することができます。 ・UNION / UNION ALLを用いる際は「SELECT構文(記載順序)の追加」の構文を用い、格納先の内部テーブルは最後に一度だけ指定 します。 ・UNIONは重複削除され、UNION ALLは重複があってもそのまま内部テーブルにデータが格納されます。
旧構文
SELECT ebeln
bukrs
FROM ekko
INTO TABLE it_ekko
WHERE ernam = l_user1.
SELECT ebeln
bukrs
FROM ekko
APPENDING TABLE it_ekko
WHERE ernam = l_user2.
新構文
SELECT FROM ekko
FIELDS ebeln,
bukrs
WHERE ernam = @l_user1
UNION
SELECT FROM ekko
FIELDS ebeln,
bukrs
WHERE ernam = @l_user2
INTO TABLE @it_ekko.
条件の左辺の演算が可能に
新構文では条件文(WHERE句)の左辺を演算して条件指定 ができます。
新構文の例
SELECT FROM ztest_saplab
FIELDS zkey1,
zfltp1,
zfltp2
WHERE zint1 + zint2 < 10
INTO TABLE @it_table.
テーブル項目以外を取得項目へ設定可能に
新構文ではテキストや変数を取得項目値として指定できるようになりました。
新構文の例
SELECT 'TEST' AS field1,
@l_text AS field2
FROM ztest_saplab
INTO TABLE @it_table.
演算した結果を取得項目へ設定可能に
新構文では計算した結果を取得項目値として指定できるようになりました。
新構文の例
SELECT 10 * 10 AS field1,
zint1 + zint2 AS field2
FROM ztest_saplab
INTO TABLE @it_table.
内部テーブルからSELECT可能に
新構文ではDBテーブルからだけではなく内部テーブルからSELECTできる ようになりました。
新構文の例
SELECT FROM @it_table AS TAB1 "内部テーブルから取得
FIELDS ZKEY1
INTO TABLE @it_table2.
新構文では内部テーブル・DBテーブルをJOINしたテーブルからSELECTも可能 です。
新構文の例
SELECT FROM @it_table AS tab1
INNER JOIN makt AS tab2
ON tab1~zkey1 = tab2~maktx
FIELDS tab1~zkey1
INTO TABLE @it_table2.
サブクエリ(副問い合わせ)が利用可能に
新構文ではサブクエリ(副問い合わせ)も利用可能になりました。
SELECT matnr
from mara
where matnr in ( SELECT matnr
from makt
WHERE matnr = mara~matnr
and maktx = 'Frame' )
INTO TABLE @data(it_mara).
さまざまな関数が利用可能に
新構文ではさまざまな関数を条件(WHERE句)や取得項目(FIELD句)に使用することができる ようになりました。
新構文の例
SELECT FROM ztest_saplab
FIELDS concat( ztext1 , ztext2 ) AS FIELD1,
lower( ztext2 ) AS FIELD2,
left( ztext3 , 4 ) AS FIELD3,
CASE ztext3
when '1' then 'GOOD'
when '2' then 'BAD'
ELSE 'NORMAL'
END AS FIELD4
WHERE concat( ztext1 , ztext2 ) = ztest_saplab~ztext3
INTO TABLE @it_table.
関数一覧
使用できる関数を以下にまとめます。
数値関数
関数 内容 ABS( field ) fieldの絶対値。 CEIL( field ) field以上の最小の整数に丸めた値。 DiV( field1,field2 ) field1をfield2で除算した際の商(整数部分)。 DIVISION( field1,field2,dec ) field1をfield2で除算して、dec(少数点の桁の位置)で四捨五入した値。 FLOOR( field ) field以下の最大の整数に丸めた値。 MOD( field1,field2 ) field1をfield2で除算した際の余り。 ROUND( field1,pos ) field1をpos(少数点の桁の位置)で四捨五入した値。
文字列関数
関数 内容 LEFT( field,len ) fieldの左側から長さlenだけ切り出したの文字列。 RIGHT( field,len ) fieldの右側から長さlenだけ切り出したの文字列。 LOWER( field ) fieldを全て小文字に変換した文字列。 UPPER( field ) fieldを全て大文字に変換した文字列。 INITCAP( field ) fieldの単語の文字列の最初の文字を大文字に変換し、それ以外の文字を小文字に変換した文字列。 LENGTH( field ) fieldの文字数。 SUBSTRING( field,pos,len ) fieldから、文字の位置posから長さlenだけ切り出した文字列。 INSTR( field1,field2 ) field1から文字列field2が最初に出現する位置。 REPLACE( field1,field2,field3 ) field1の文字列に対し、field2をfield3に置換した文字列 CONCAT( field1,field2 ) field1,field2を連結した文字列。 CONCAT_WITH_SPACE( field1,field2,len ) field1,field2を長さlenのスペースを間に挟んで連結した文字列。 LTRIM( field,char ) fieldの文字列の左側の文字charを削除した文字列。 RTRIM( field1,char ) fieldの文字列の右側の文字charを削除した文字列。 LPAD( field1,len,field2 ) field1を長さlenだけ切り出した文字列。 その際、長さlenに満たない場合は左側に文字列field2を埋めた文字列となる。 RPAD( field1,len,field2 ) field1を長さlenだけ切り出した文字列。 その際、長さlenに満たない場合は右側に文字列field2を埋めた文字列となる。
条件の関数
関数 内容 CASE field1 WHEN value1 THEN return1 WHEN value2 THEN return2 … ELSE return3 END field1の値が、 ・value1の時にreturn1を返す。 ・value2の時にreturn2を返す。 … ・上記以外の時にreturn3を返す。 CASE WHEN cond1 THEN return1 WHEN cond2 THEN return2 … ELSE return3 END ・条件式cond1が正の時にreturn1を返す。 ・条件式cond2が正の時にreturn2を返す。 … ・上記以外の時にreturn3を返す。 ※上に記載している条件が優先される。 COALESCE( field1,field2,field3,… ) field1,field2,field3…のうち、最初にNULLではない値を返す。
SELECTに関するABAP7.4以降の新構文についての解説は以上じゃ。 まだ新構文はあるので、都度更新していくぞい!