SQL Server中ORDER BY后面能够是表达式和子查询

假如SQL Server数据库中如今有Book表以下数据库

CREATE TABLE [dbo].[Book]( [ID] [int] IDENTITY(1,1) NOT NULL, [BookName] [nvarchar](50) NULL, [BookDescription] [nvarchar](50) NULL, [ISBN] [nvarchar](20) NULL, [CreateTime] [datetime] NULL, CONSTRAINT [PK_Book] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Book] ADD  CONSTRAINT [DF_Book_CreateTime]  DEFAULT (getdate()) FOR [CreateTime]

有以下数据:express

SET IDENTITY_INSERT [dbo].[Book] ON 
GO
INSERT [dbo].[Book] ([ID], [BookName], [BookDescription], [ISBN], [CreateTime]) VALUES (1, N'Chinese', N'This is a very good Chinese book', N'0001', CAST(N'2018-10-17T15:25:18.450' AS DateTime)) GO
INSERT [dbo].[Book] ([ID], [BookName], [BookDescription], [ISBN], [CreateTime]) VALUES (2, N'English', N'English', N'0002', CAST(N'2018-10-17T15:25:18.457' AS DateTime)) GO
INSERT [dbo].[Book] ([ID], [BookName], [BookDescription], [ISBN], [CreateTime]) VALUES (3, N'Japanese', N'Japanese', N'0003', CAST(N'2018-10-17T15:25:18.473' AS DateTime)) GO
INSERT [dbo].[Book] ([ID], [BookName], [BookDescription], [ISBN], [CreateTime]) VALUES (4, N'Russian', N'Russian', N'0004', CAST(N'2018-10-17T15:25:18.483' AS DateTime)) GO
INSERT [dbo].[Book] ([ID], [BookName], [BookDescription], [ISBN], [CreateTime]) VALUES (5, N'Italian', N'Italian', N'0005', CAST(N'2018-10-17T15:25:18.493' AS DateTime)) GO
SET IDENTITY_INSERT [dbo].[Book] OFF

 

咱们使用SELECT语句查询该表,以下所示:spa

SELECT *
FROM [dbo].[Book]

 

如今设想一个问题,咱们如何根据[BookName]和[BookDescription]两列数据的联合值来对结果进行排序呢?3d

我想不少人都会想到用子查询,以下所示:code

SELECT [ID],[BookName],[BookDescription],[ISBN],[CreateTime]
FROM ( SELECT [ID],[BookName],[BookDescription],[ISBN],[CreateTime],[BookName]+N'#'+[BookDescription] AS [Combine]
    FROM [dbo].[Book] ) AS T ORDER BY [Combine]

 

像上面这样用子查询的确没有问题,可是你知道吗,咱们是能够直接在ORDER BY语句中写表达式的,以下所示:blog

SELECT *
FROM [dbo].[Book]
ORDER BY [BookName]+N'#'+[BookDescription]

结果和用子查询彻底同样排序

 

咱们也能够在ORDER BY中使用多个表达式和列来对结果进行排序,甚至咱们能够根据一个子查询来对结果进行排序,以下所示:ip

SELECT *
FROM [dbo].[Book]
ORDER BY [BookName]+N'#'+[BookDescription] ASC, (SELECT TOP 1 R_BOOK.[ISBN] FROM [dbo].[Book] AS R_BOOK WHERE R_BOOK.[BookName]=[BookName]) DESC, --这里的子查询只能返回一行和一列数据,不然SQL Server会报错
         [CreateTime] ASC

 

可是ORDER BY后面不能是常量,好比下面这样咱们在ORDER BY后面跟一个字符串常量是不行的:字符串

SELECT *
FROM [dbo].[Book]
ORDER BY N'Constant'

执行该语句会报错:get

Msg 408, Level 16, State 1, Line 3 A constant expression was encountered in the ORDER BY list, position 1.
相关文章
相关标签/搜索