【问题标题】:Keyset Pagination with Null Values具有空值的键集分页
【发布时间】: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


【解决方案1】:

coalesce 的想法是正确的。

您似乎在密钥集的末尾缺少一个唯一的不可为空的列 (id)。这是保持列明确所必需的,这样您就不会遇到那些奇怪的“重新开始”效果。

确保在您使用的索引中包含 coalesce 表达式以加快搜索和排序。

【讨论】:

  • 我在某些地方有 not nullabe id 列,但在其他地方没有,这导致了问题。感谢您的帮助。
  • @LaurenzAlbe 你能看看stackoverflow.com/q/67917808吗?我遇到了类似问题。
猜你喜欢
  • 2021-08-27
  • 2014-11-13
  • 2016-06-06
  • 1970-01-01
  • 2022-07-25
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多