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 byWHERE 子句,而不是完整的 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