在多排序条件下SQL获文章上一条、下一条记录

        在我们开发CMS系统的时候经常会碰到需要根据当前记录来读取它的上一条记录或下一条记录的现像。单字段排序时SQL语句非常简单,但是当以多字段排序时应该怎么写呢?实际上也复杂,多字段无法搞定那么我们就需要将多个字段合并在一起,形成一个固定长度的字符串,再将这个生成的字符串做为排序字段进行排序。注意,这个排序字符串的长度一定要是固定的,所有记录生成的排序字符串长度一至才能准确进行排序。

表结构:

CREATE TABLE [table1](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [Sort] [int] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
CONSTRAINT [PK_table1] PRIMARY KEY 
(
    [Id] ASC
) ON [PRIMARY]

        在这个表中Id是主键,我们用Id做为条件来查询当前记录,以Sort和CreatedOn两个字段做为排序字段。Sort是数字型值为1-9999,因为它的最大值是四位数9999,为了保证我们生成的字符串长度是一至的,所以我们把它转换生成一个5位的字符串。如:10000+1=10001、10000+9999=19999。

上一条:

SELECT 
     top 1 *,(convert(varchar,10000 + sort) + convert(varchar,createdOn,120)) as a1
FROM 
    table1 
WHERE 
    (convert(varchar,10000 + sort)+ convert(varchar,createdOn,120)) < (select a1=(convert(varchar,10000 + sort)+ convert(varchar,createdOn,120)) from table1 where id=5) 
order by a1 desc;

下一条:

SELECT 
    TOP 1 *,(convert(varchar,10000 + sort) + convert(varchar,createdOn,120)) as a1
 FROM 
table1
WHERE
(
convert(varchar,10000 + sort) + convert(varchar,createdOn,120)) > (select a1=(convert(varchar,10000 + sort) + convert(varchar,createdOn,120)) from table1 where id=2)
order by a1 asc;
原文地址:https://www.cnblogs.com/lswweb/p/4200443.html