Db2は以前から、FETCH FIRST n ROWS ONLYをつけることにより、SELECTでn行までしか取得しないように限定する書き方ができました。
Db2 for LUW 11.1より、FETCH FIRSTの中にOFFSET節を指定して、スキップする行数を設定できるようになりました。
また、FETCH FIRST ... OFFSET節の代替構文として、LIMIT ... OFFSETも使用できるようになっています。
#FETCH FIRST節を使ったシンプルSQL
FETCH FIRST節はSELECTの中の様々な場所で使用することができますが、こちらはDb2のSAMPLEデータベースのEMPLOYEE表から5行のみを取り出すシンプルな例です。
(ここではORDER BY節がないため、順序は確定的ではありません。)
SELECT LASTNAME FROM EMPLOYEE FETCH FIRST 5 ROWS ONLY
LASTNAME
---------------
STERN
PULASKI
HENDERSON
SPENSER
LUCCHESSI
5 レコードが選択されました。
#FETCH FIRST節のOFFSETオプション
FETCH FIRST n ROWS ONLYにOFFSETキーワードを使用して、スキップする行数を指定することができます。
OFFSETキーワードのシンタックスです。
OFFSET n ROWS FETCH FIRST x ROWS ONLY
OFFSET n ROWSはFETCH FIRST x ROWS ONLYの前に置き、行を取得する前にスキップする行数を指定します。
この例は、EMPLOYEE表から最初の10行を取得します。(ORDER BY節がないため順序は確定されていません。)
SELECT LASTNAME FROM EMPLOYEE FETCH FIRST 10 ROWS ONLY
LASTNAME
---------------
HAAS
THOMPSON
KWAN
GEYERSPENSER
STERNLUCCHESSI
PULASKI
HENDERSON
SPENSER
LUCCHESSI
O'CONNEL
10 レコードが選択されました。
OFFSET 0 ROWSは行をスキップしないという指定になります。
SELECT LASTNAME FROM EMPLOYEE OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY
以下の例は、5行をスキップし、5行を取得します。
SELECT LASTNAME FROM EMPLOYEE OFFSET 5 ROWS FETCH FIRST 5 ROWS ONLY
LASTNAME
---------------
O'CONNEL
QUINTANAHENDERSON
NICHOLLASSPENSER
ADAMSONLUCCHESSI
PIANKA
5 レコードが選択されました。
#LIMIT ... OFFSETの代替構文
Db2 11.1では、PostgreSQLやMySQLなど他のデータベース製品で使用されるSQLも簡単にDb2環境で実行できるようにする機能拡張が含まれており、FETCH FIRST ... OFFSET節の代替として、LIMIT ... OFFSETの代替構文も使用できるようになりました。
代替構文 | 同等の構文 |
---|---|
LIMIT x | FETCH FIRST x ROWS ONLY |
LIMIT x OFFSET y | OFFSET y ROWS FETCH FIRST x ROWS ONLY |
LIMIT y,x | OFFSET y ROWS FETCH FIRST x ROWS ONLY |
#参考資料
-
- fetch-first-clause
- offset-clause
-
SQL の互換性の機能拡張
- FETCH FIRST 節の OFFSET オプション
- 代替構文