2

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

这很好用!

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

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

或者

如何让查询为 Next 查询返回 NULL 行?所以我可以针对 NULL 结果进行测试?

奖励积分!

我怎样才能有一个查询可以给我第一条记录、最后一条记录以及下一条和上一条,这样我就可以启用循环分页了?如果在第一条记录上显示最后一条记录为上一条。如果在最后一条记录上显示下一条记录作为第一条记录?

4

1 回答 1

3
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

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

于 2012-11-29T12:09:14.707 回答