2011-01-14 84 views
3

我有一個包含像行值的字符串類型的列:ORDER BY在SQL

1-1 
1-5 
1-14 
1-7 
1-3 

現在,如果我使用ORDER BY上欄我得到的順序爲:

1-1 
1-14 
1-3 
1-5 
1-7 

什麼將它順序1-1, 1-3, 1-5,1-7,1-14

感謝您的時間適當的方式

+0

這樣的數據沒有簡單的方法。你能否改變模式以另一種方式存儲數據? – Mark 2011-01-14 15:05:02

+0

所有字段的「1-」是否相同,還是「2-」,「3-」和「10-」?這些確實是日期字段(月份和日期)? 「1-31」是在「2-1」之前還是之後? – rajah9 2011-01-14 15:09:18

+0

@Mark Cant不幸地改變了架構。 @ rajah9那些不是日期,他們是某種代碼。 – Adnan 2011-01-14 15:25:51

回答

7

您可以重命名「1-1」到「1-01」

+0

或將1-1重命名爲0001-0001,以保證安全。 ;) – WCWedin 2011-01-14 15:16:45

2

試試這個:

SELECT * FROM 
(
SELECT '1-1' Id 
UNION 
SELECT '1-5' Id 
UNION 
SELECT '1-14' Id 
UNION 
SELECT '1-7' Id 
UNION 
SELECT '1-3' Id 
) a 
ORDER BY CAST(REPLACE(Id, '-', '') AS UNSIGNED) 
1

是否有單獨對它們進行排序後一起2個獨立的列和CONCAT兩個分裂柱的可能性?

現在的問題是您的列正在按字符串排序,而不是整數。

5

正確的方法是將它們作爲整數存儲在不同的列中。

0

您可以使用類似(如果第一個字母沒有按-T梅特)

ORDER BY CAST(SUBSTRING(場,CHARINDEX(場, ' - ',0)+1,LEN(場)+1 )爲INT)

不是很漂亮,但..

10

假設你的第一個字符也可能會有所不同:

order by convert(substr(my_field, 1, locate(my_field, '-') - 1) as int), 
     convert(substr(my_field, locate(my_field, '-') + 1) as int) 
0
SELECT * 
FROM (
     SELECT '1-1' Id 
     UNION ALL 
     SELECT '1-5' Id 
     UNION ALL 
     SELECT '1-14' Id 
     UNION ALL 
     SELECT '1-7' Id 
     UNION ALL 
     SELECT '1-3' Id 
     UNION ALL 
     SELECT '10-4' Id 
     ) a 
ORDER BY 
     CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(id, '-', -2), '-', 1) AS UNSIGNED), 
     CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(id, '-', -1), '-', 1) AS UNSIGNED) 
1

如果有對結構進行任何改變都是絕對不可能的,我想說Carl Manaster的方法是最好的。儘管如此,這對大數據集的工作會很慢。

您也可以嘗試添加一個「排序」欄(並建立索引),那麼每一個新的代碼加到你可以計算出它的時候的值,例如:

1-5爲1000 + 5 = 1005 1-14變爲1000 + 14 = 1014

並將其保存到該排序列中。這將工作得更快。 您也可以編寫一個簡單的觸發器,以便自動計算此排序值。