如何通过Desc StartDate查询订单但NULLS优先

时间:2013-08-16 10:06:41

标签: sql-server

sQL FIDDLE

CREATE TABLE [STUDENT_MASTER]
(
   [User_ID]        [int] IDENTITY (1, 1) NOT NULL CONSTRAINT STUDENT_MASTER_P_KEY PRIMARY KEY,
   [Name]           [varchar] (50), 
   [START_DATE]     [varchar] (50),
   [PRIORITY]       [varchar] (50) 
)

INSERT INTO STUDENT_MASTER
VALUES('JOHN','2013-08-16','4')
INSERT INTO STUDENT_MASTER
VALUES('JACK','2013-08-10','')
INSERT INTO STUDENT_MASTER
VALUES('MACK','','1')
INSERT INTO STUDENT_MASTER
VALUES('ACK','2013-08-15','2')

//SQL QUERY

SELECT ROW_NUMBER() OVER 
(ORDER BY CASE 
WHEN STUDENT_MASTER.START_DATE IS NULL THEN 1
WHEN STUDENT_MASTER.PRIORITY IS NULL THEN 1 
ELSE 0 END,STUDENT_MASTER.START_DATE DESC ,STUDENT_MASTER.PRIORITY DESC
)AS RowNumber,STUDENT_MASTER.START_DATE
FROM STUDENT_MASTER

如何按DESC查询开始日期和第一个空值

3 个答案:

答案 0 :(得分:4)

DEMO

ORDER BY 
  CASE WHEN START_DATE = '' THEN 0 ELSE 1 END ASC,
  START_DATE DESC

您可以使用ISNULL,但您的列没有null值 - 它有空字符串整数。

另一个问题是 - 因为您的START_DATE列是VARCHAR,而不是DATETIME,它会执行字符串,字母排序,而不是日期时间排序。

答案 1 :(得分:0)

不要只按StartDate订购,按StartDate订购,如果订货为空,则订购默认值。

ORDER BY ISNULL(StartDate, '9999-12-31') DESC

哦......让你的约会时间成为实际的约会时间。否则你只是按字母顺序排序。

答案 2 :(得分:0)

考虑到你的日期是字符串,这将是我解决问题的方法

SELECT
     start_date
FROM
     STUDENT_MASTER
ORDER BY
     LEN(start_date),
     start_date DESC

关注SQL Fiddle