我正在尝试从 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/