DB2は指定した数だけレコードを読み飛ばすためには、以前ではROW_NUMBER()関数が用いられてきました。DB2 バージョン 11.1よりSQL標準のOFFSETがサポートされました。そこで以前から使用されているROW_NUMBER()とOFFSETの使用方法と比較についてみていきましょう。
ペンちゃん
今回はDB2の指定した数だけレコードを読み飛ばすOFFSETオプションについてお勉強しましょう!
スポンサーリンク
ROW_NUMBER()関数の使い方
ROW_NUMBER()は、over句でソート順を指定してwhere句では取得する範囲を限定するために使用します。
ROW_NUMBER()の構文
ROW_NUMBER()の構文は以下の通りです。
1 |
SELECT * FROM ( SELECT table.* , ROW_NUMBER() OVER (ORDER BY ソート順) num FROM table) tmp WHERE num between 範囲 ORDER BY ソート順 |
ROW_NUMBER()の使用例
たとえば、数字(number)とその読み方(yomikata)が格納されているyomikatatableの5~10番目を取得するには以下のようにします。
1 |
SELECT * FROM ( SELECT yomikatatable.* , ROW_NUMBER() OVER (ORDER BY number ASC) num FROM yomikatatable) tmp WHERE num between5 and 10 ORDER BY number ASC; |
結果は以下の通りです。
1 2 3 4 5 6 7 8 |
number yomikata --------------- 5 go 6 roku 7 nana 8 hachi 9 kyu 10 jyu |
OFFSETオプションの使い方
OFFSETオプションの構文
OFFSETオプションは何レコード取得するかを指定する「FETCH FIRST m ROWS ONLY」とともに使用されます。
nレコード飛ばしてmレコード取得するためには以下の構文を使用します。
1 |
SELECT * FROM table OFFSET n ROWS FETCH FIRST m ROWS ONLY ORDER BY ソート順 |
OFFSETの使用例
たとえば、数字(number)とその読み方(yomikata)が格納されているyomikatatableの5~10番目を取得するには4レコード飛ばして6レコード取得すればよいので以下のようになります。
1 |
SELECT * FROM yomikatatable OFFSET 4 ROWS FETCH FIRST 6 ROWS ONLY ORDER BY number ASC; |
結果は以下の通りです。
1 2 3 4 5 6 7 8 |
number yomikata --------------- 5 go 6 roku 7 nana 8 hachi 9 kyu 10 jyu |
まとめ
ROW_NUMBER()関数が用いられてきました。Db2 バージョン 11.1よりサポートされているOFFSETと以前から使用されているROW_NUMBER()の使用方法と比較についてみてみました。ぜひ使ってみてください。
ペンちゃん
今回はDB2の指定した数だけレコードを読み飛ばすOFFSETオプションについてお勉強しました!