SQL 在单词前有数字的字母数字字段上按 DESC 排序
SQL Order by DESC on alphanumeric field with numbers before words
我在 SQL table 中有一个专栏,我想在 之前下订单。数据需要按顺序排列,以便首先显示最近的年份。
Sample Data Expect Output
----------- -------------
older 2013
2012 2012
2013 2011
2011 older
使用这种特殊方法,我只能访问 Order by
和 WHERE
子句,而不是完整的 SQL.
这限制了我能够将数据分 2 组提取并加入。
我也无法将 older
字段操作为 999order
之类的内容,然后再将 999
删除。
有没有一种订购方式可以满足我的需求?
您可以在 ORDER BY
子句中使用 CASE
语句:
WITH tbl AS(
SELECT 'older' AS date_col UNION ALL
SELECT '2012' UNION ALL
SELECT '2013' UNION ALL
SELECT '2011'
)
SELECT *
FROM tbl
ORDER BY
CASE
WHEN date_col NOT LIKE '%[^0-9]%' THEN 0
ELSE 1
END,
date_col DESC
NOT LIKE '%[^0-9]%'
表示date_col
由所有数字组成。将 0
分配给这些行,因为它们将排在第一位。然后按 date_col DESC
.
排序
结果
date_col
--------
2013
2012
2011
older
一个(肮脏的)技巧是使用 bin
函数:它将 return '0'
用于非数字字符串,因此 'older
' 将排在第一位:
SELECT *
FROM mytable
ORDER BY BIN(year_column)
你可以试试这个:
SELECT * FROM t5 ORDER BY BIN(samp_data) DESC;
我们能不能用ISNUMERIC()
函数代替NOT LIKE
DECLARE @test TABLE
(
value varchar(10)
)
INSERT INTO @test
VALUES
('2010'),
('2011'),
('2012'),
('2013'),
('2014'),
('2015'),
('older')
SELECT * From @test
ORDER BY
(CASE WHEN ISNUMERIC(value) = 1 THEN 0 ELSE 1 END),value DESC
这将首先显示数字行
Select *
From [Table Name]
Order By IsNumeric([Column Name]) DESC, [Column Name] DESC
我在 SQL table 中有一个专栏,我想在 之前下订单。数据需要按顺序排列,以便首先显示最近的年份。
Sample Data Expect Output
----------- -------------
older 2013
2012 2012
2013 2011
2011 older
使用这种特殊方法,我只能访问 Order by
和 WHERE
子句,而不是完整的 SQL.
这限制了我能够将数据分 2 组提取并加入。
我也无法将 older
字段操作为 999order
之类的内容,然后再将 999
删除。
有没有一种订购方式可以满足我的需求?
您可以在 ORDER BY
子句中使用 CASE
语句:
WITH tbl AS(
SELECT 'older' AS date_col UNION ALL
SELECT '2012' UNION ALL
SELECT '2013' UNION ALL
SELECT '2011'
)
SELECT *
FROM tbl
ORDER BY
CASE
WHEN date_col NOT LIKE '%[^0-9]%' THEN 0
ELSE 1
END,
date_col DESC
NOT LIKE '%[^0-9]%'
表示date_col
由所有数字组成。将 0
分配给这些行,因为它们将排在第一位。然后按 date_col DESC
.
结果
date_col
--------
2013
2012
2011
older
一个(肮脏的)技巧是使用 bin
函数:它将 return '0'
用于非数字字符串,因此 'older
' 将排在第一位:
SELECT *
FROM mytable
ORDER BY BIN(year_column)
你可以试试这个:
SELECT * FROM t5 ORDER BY BIN(samp_data) DESC;
我们能不能用ISNUMERIC()
函数代替NOT LIKE
DECLARE @test TABLE
(
value varchar(10)
)
INSERT INTO @test
VALUES
('2010'),
('2011'),
('2012'),
('2013'),
('2014'),
('2015'),
('older')
SELECT * From @test
ORDER BY
(CASE WHEN ISNUMERIC(value) = 1 THEN 0 ELSE 1 END),value DESC
这将首先显示数字行
Select *
From [Table Name]
Order By IsNumeric([Column Name]) DESC, [Column Name] DESC