plasmasphere.net -プラズマスフィア ドットネット-
Diary
Oracleでページ替え
2006/09/28(Thu) 00:09
先日Oracleを使う機会があって、今まで使ってたMySQL,Postgres SQLと少し違って苦労した点を…。
何でLIMIT使えんのかと。
Webシステムを作ってると、絶対にページ替えってやつはついてまわってくるんですが、それをプログラムとデータベースでやろうと思いまして。
要は、データベースにアクセスするときに…
1ページの場合はデータベースの実行結果の0行目から9行目を返す。
2ページの場合はデータベースの実行結果の10行目から19行目を返す。
って感じでやれば良いんですが、何かOracleさんには良いクエリが無いようで。
一応、指定の行を返すクエリのROWNUM
ってヤツがあるんですが、こいつがイマイチ使い勝手が悪くて、データを降順で出力したとしても、行はそれに定義されてないんですね。
例えば値段でソートしたとして
行(ROWNUM) | 商品名 | 値段 |
---|---|---|
1 | 商品1 | 100円 |
18 | 商品15 | 200円 |
36 | 商品6 | 300円 |
5 | 商品23 | 400円 |
みたいな感じで、実行した結果に行(ROWNUM)を振って、それをさらに値段で降順にソートするから、行の番号は狂い咲き。
かと言ってソートした後にROWNUMを指定するとクエリエラーが返ってくる素敵仕様。
Oracleはおバカちゃんですねとか思いながら、Google大先生に質問を投げかけて、やっと見つけました。
SELECTを入れ子にすればいいんですね。
ただ、降順ソートした結果に行(ROWNUM)を振って、さらにその行(ROWNUM)の0番目から10番目を取り出すとかクエリを書くと、もうアホかってくらいSQL文が伸びます。
SELECT 行,商品名,値段 FROM ( SELECT ROWNUM as 行,商品名,値段 FROM ( SELECT 商品名,値段 FROM 在庫状況 ORDER BY 値段 ASC ) ) WHERE 行 between 0 AND 10
値段を降順で取得するようにクエリを渡した実行結果の、値の順番に行番号を振って、その行番号の0から10を取り出す、って読むといいです。
考えればこの方法しかないのはすぐ分かるんだけど、実際やってるとそうそう思いつかないもんです。
地味なトコで地味に詰まったので書き残しておきます。
ていうかWebサービスでOracle使うなと。MySQLで充分だろうと。
真面目に日記書いたのはじめてかもしれない、そんなサイト6年目の秋の夜。
参考にしたページ
http://d.hatena.ne.jp/yone098/20060823/1156329508
ネタ不足に負けた、自分がいます。
実際仕事の結果得られたものを書くと、頑なに拒んできた何かが自分の中で崩れていく非常に悲しい思いに駆られます。
拒んできた何かは何か分かりません。分かりたくありません。実感したくありません。
だから言わないで下さい。お願いします_| ̄|○