【发布时间】:2020-10-10 01:38:14
【问题描述】:
我一直在尝试让 Keyset Pagination 与排序中有多个可为空的列的查询一起工作。
一切都按预期排序,问题是当您开始对值进行键集分页时。问题显然在于您无法对 null 进行正常比较
select null
因此,当您在 where 子句中执行 (last_name, first_name, middle_name, id) > (null, 'Elinor', null, null) 时,它的计算结果为 null
当我试图显示没有姓名或没有姓氏的人时,这会产生问题,我无法通过这些页面进行分页。
我尝试将“ZZZZZZZZZ”合并到字段中,但这似乎在某些地方产生了奇怪的伪影,导致我的分页重置并重新开始
我不关心空值出现的顺序(第一个或最后一个),只要它是一致的并且我可以获得良好一致的工作分页。
在实际系统中,我将加入另一个表上的名称,因此名称字段可以全部为空(在这种情况下,id 在另一个表的 id 中,所以它总是有一个值)
create table names(
id serial primary key,
people_id integer,
last_name text,
first_name text,
middle_name text
)
-- A person with no last name needs to be able to be paged
select * from names
where (last_name, first_name, middle_name, id) > (null, 'Elinor', null, null)
order by last_name, first_name, middle_name, id
limit 1
-- A person with no name needs to be able to be paged
select * from people
left join names on people.id = names.people_id
where (last_name, first_name, middle_name, people.id) > (null, null, null, 200)
order by last_name, first_name, middle_name, id
limit 1
【问题讨论】:
-
根据定义键集分页需要行上的唯一键,用于标识结果集中的位置。唯一键不应包含可为空的组件。
-
确保在比较和 order 子句中合并字段,尤其是降序排序时。
标签: sql postgresql