2015-09-04 181 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