アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

PostgreSQLでSQL_CALC_FOUND_ROWS的なことをしたい

MySQLだと、

SELECT SQL_CALC_FOUND_ROWS
  `hoge`
 ,`fuga`
FROM
  `piyopiyo_table`
WHERE
  `hoge` > 10
LIMIT 0, 5

というふうに「SQL_CALC_FOUND_ROWS」をくっつけたSELECT文を発行した直後に

SELECT FOUND_ROWS();

とやってやれば、LIMITで制限されていない全件数を知ることができるのですが

PostgreSQLだとどうやるのかなーと思って調べてみたところ、こんな感じでした。

SELECT
  "hoge"
 ,"fuga"
 ,COUNT(*) OVER() AS "found_rows"
FROM
  "piyopiyo_table"
WHERE
  "hoge" > 10
LIMIT 5 OFFSET 0

「抽出した全レコードにくっついてくること」と「全件数は1以上だがLIMITOFFSETで絞り込んだら0件になるときは取得できないこと」がなかなか気持ち悪いですが、
2回同じようなクエリ発行するよりはマシなケースも多々ありそう。

OVERについてはいろいろ使えそうなので勉強したい。

参考
PostgreSQLで総件数とページングデータを同時に取得する
Window関数 | Let's Postgres