繁体   English   中英

在字母数字字段上用单词前的数字对DESC进行SQL排序

[英]SQL Order by DESC on alphanumeric field with numbers before words

我正在尝试按顺序在SQL表中有一列。 数据必须采用desc格式,因此必须先显示最近几年的数据。

Sample Data         Expect Output
-----------         -------------
older                   2013
2012                    2012
2013                    2011
2011                    older

使用这种特定方法,我只能访问Order byWHERE子句,而不能使用完整的SQL。

这限制了我不能将数据分两组提取并加入。 我也不能处理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函数:它将为非数字字符串返回'0' ,因此'older ”将首先出现:

SELECT   *
FROM     mytable
ORDER BY BIN(year_column)

您可以尝试以下方法:

SELECT * FROM t5 ORDER BY BIN(samp_data) DESC;

我们可以不使用ISNUMERIC()函数代替NOT LIKE ISNUMERIC()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM