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]

有如下數據:

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語句查詢該表,如下所示:

SELECT *
FROM [dbo].[Book]

 

現在設想一個問題,我們如何根據[BookName]和[BookDescription]兩列數據的聯合值來對結果進行排序呢?

我想很多人都會想到用子查詢,如下所示:

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語句中寫表達式的,如下所示:

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

結果和用子查詢完全一樣

 

我們也可以在ORDER BY中使用多個表達式和列來對結果進行排序,甚至我們可以根據一個子查詢來對結果進行排序,如下所示:

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'

執行該語句會報錯:

Msg 408, Level 16, State 1, Line 3
A constant expression was encountered in the ORDER BY list, position 1.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM