問(wèn)題
當(dāng)使用數(shù)據(jù)庫(kù)查詢數(shù)據(jù)壹罚,并且返回的數(shù)據(jù)行數(shù)很多時(shí)翩剪,往往需要對(duì)數(shù)據(jù)進(jìn)行分頁(yè)(pagination)官还,以便UI或者數(shù)據(jù)使用者進(jìn)行處理。在PostgreSQL中讥耗,如何對(duì)數(shù)據(jù)進(jìn)行分頁(yè)呢有勾?
解決方法
PostgreSQL提供了limit
和offset
,可以對(duì)數(shù)據(jù)進(jìn)行分頁(yè)古程。先簡(jiǎn)要說(shuō)一下二者的含義蔼卡。
-
limit n
當(dāng)Select語(yǔ)句返回的數(shù)據(jù)行數(shù)大于n時(shí),只返回n條數(shù)據(jù)挣磨。否則雇逞,返回實(shí)際的數(shù)據(jù)行數(shù)。 -
offset m
跳過(guò)前m條數(shù)據(jù)茁裙,然后返回相應(yīng)的數(shù)據(jù)塘砸。如果與limit n
結(jié)合使用,則先跳過(guò)前m條數(shù)據(jù)晤锥,然后再返回n條數(shù)據(jù)(當(dāng)數(shù)據(jù)行數(shù)>n)或者返回實(shí)際的數(shù)據(jù)行數(shù)掉蔬。
將二者結(jié)合,就可以對(duì)數(shù)據(jù)進(jìn)行分頁(yè)處理了矾瘾。
比如女轿,數(shù)據(jù)表中有1000行顧客數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行分頁(yè)壕翩,每頁(yè)100條數(shù)據(jù)蛉迹。可以使用如下的SQL語(yǔ)句進(jìn)行處理戈泼。當(dāng)返回的數(shù)據(jù)條數(shù) < limit時(shí)婿禽,說(shuō)明是最后一頁(yè),沒(méi)有新的數(shù)據(jù)了大猛。
select
id,
name
from customer
offset $1 -- $1 分別為0, 100(limit), ..., x * limit
limit 100;