DES在字母数字字段上的SQL顺序,单词前面有数字

时间:2015-09-04 08:44:32

标签: mysql sql sql-server select kentico

我在SQL表中有一个列,我正在尝试按顺序执行。数据需要在desc中显示,因此它最近显示的是最近几年。

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

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

这限制了我能够将数据拉出2组并加入。 我也无法将older字段操作为类似999order的内容,并稍后删除999

有没有办法订购,这会给我我想要的东西?

5 个答案:

答案 0 :(得分:4)

您可以在CASE子句中使用ORDER BY语句:

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排序。

<强> RESULT

date_col
--------
2013
2012
2011
older

答案 1 :(得分:0)

一个(脏)技巧是使用bin函数:对于非数字字符串,它将返回'0',因此'older'将首先出现:

SELECT   *
FROM     mytable
ORDER BY BIN(year_column)

答案 2 :(得分:0)

你可以试试这个:

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

答案 3 :(得分:0)

我们不能使用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

答案 4 :(得分:0)

这将首先显示数字行

Select * 
From  [Table Name] 
Order By IsNumeric([Column Name]) DESC, [Column Name] DESC