2015-09-04 226 views
2

我在SQL表中有一列我正在尝试通过执行一个命令。数据需要在desc中显示,因此它首先显示更近的年份。SQL按字母顺序排序的字母数字字段上的字母数字字段

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

使用这种特殊的方法,我只可以访问Order byWHERE条款,而不是完全成熟的SQL。

这限制了我无法将数据拉出两组并加入。 我也不能将older字段操作为999order之类的字段,并在稍后剥离999

有没有一种方法可以让我知道我在找什么?

+1

什么是“特殊方法”你说的是数字排?你尝试使用数据查询吗? http://devnet.kentico.com/articles/kentico-8-technology-dataquery-advanced-api(它支持连接) – rocky

回答

4

您可以在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 
+1

工作魅力伴侣感谢。 – Spitfire2k6

0

一(脏)诀窍是使用bin功能:它会返回'0'一个非数字字符串,所以'older'将是第一位的:

SELECT * 
FROM  mytable 
ORDER BY BIN(year_column) 
0

您可以试试这个:

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

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 
0

这将显示第一

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