sql - 如何通过sql选择第一个、最后一个、上一个和下一个

标签 sql sql-server

我正在尝试从 sql 语句创建记录分页,我能够获取所有记录的下一条和上一条,但最后一条记录将上一条记录显示为下一条,因为 sql 查询仅返回 1 行而不是 2 行。我根据第一个结果设置下一个结果,将上一个结果设置为第二个结果。

数据:

  • 苹果
  • 香蕉
  • 葡萄
  • 橙色

sql:

select * 
from (select top 1 fruit 
      FROM table 
      where fruit > 'Banana' 
      order by fruit asc) as x 

UNION ALL 

select * 
from (select top 1 fruit 
      FROM table 
      where fruit < 'Banana' order by fruit desc) as y

结果:

fruit
--------
Grape
Apple

这太棒了!

对于第一条记录 - 我得到的正确结果是第一条记录是真正的下一条记录。 对于最后一条记录 - 我得到一个结果,这是获取前一条记录的第二个查询。但是我无法知道它的最后一条记录,因此它输出为下一条而不是上一条。

我如何确定这是最后一条记录并且返回的单行实际上是前一条记录?

或者

如何让查询为下一个查询返回 NULL 行?那么我可以测试 NULL 结果吗?

奖励积分!

如何才能有一个查询提供第一条记录、最后一条记录以及下一条记录和上一条记录,以便我可以启用循环分页?如果在第一条记录上,则将最后一条记录显示为上一条记录。如果在最后一条记录上显示下一条记录作为第一条记录?

最佳答案

SELECT
  *
FROM
(
  SELECT
    MIN(fruit)   as first,
    MAX(fruit)   as previous
  FROM
    yourTable
  WHERE
    fruit < 'banana'
)
CROSS JOIN
(
  SELECT
    MIN(fruit)   as next,
    MAX(fruit)   as last
  FROM
    yourTable
  WHERE
    fruit > 'banana'
)

或者,更短,但我不确定它的性能会更高......

SELECT
  MIN(CASE WHEN fruit < 'banana' THEN fruit END)   as first,
  MAX(CASE WHEN fruit < 'banana' THEN fruit END)   as previous,
  MIN(CASE WHEN fruit > 'banana' THEN fruit END)   as next,
  MAX(CASE WHEN fruit > 'banana' THEN fruit END)   as last
FROM
  yourTable

或者,作为最后一个奇怪的选择......

SELECT
  (SELECT TOP 1 fruit FROM yourTable WHERE fruit < 'banana' ORDER by fruit ASC)  AS first,
  (SELECT TOP 1 fruit FROM yourTable WHERE fruit < 'banana' ORDER by fruit DESC) AS previous,
  (SELECT TOP 1 fruit FROM yourTable WHERE fruit > 'banana' ORDER by fruit ASC)  AS next,
  (SELECT TOP 1 fruit FROM yourTable WHERE fruit > 'banana' ORDER by fruit DESC) AS last

(如果您有数千条以上的记录,这可能很有用,因为每条记录都可以快速且单独地搜索。)

关于sql - 如何通过sql选择第一个、最后一个、上一个和下一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13625251/

相关文章:

php - 1 周的每日平均值

c# - 无法使 EF 与我现有的数据库一起使用

mysql - SQL - 如何计算自定义创建的错误代码

sql - 向表中插入一行的日期

sql - 在不知道下一个字符的情况下替换值中的文本

sql - PostgreSQL 分组错误

c# - 如何将包含一些公共(public)数据的多个集合保存到数据库?

sql - Oracle SQL - 如果存在,删除表并创建

mysql - 我有一个用户表和金额表,即使金额为空或零,我也想向所有用户显示金额

ios - 如何将多个客户端与非特定平台的云数据库同步