我有一個包含像行值的字符串類型的列: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
感謝您的時間適當的方式
我有一個包含像行值的字符串類型的列: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
感謝您的時間適當的方式
試試這個:
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)
是否有單獨對它們進行排序後一起2個獨立的列和CONCAT兩個分裂柱的可能性?
現在的問題是您的列正在按字符串排序,而不是整數。
正確的方法是將它們作爲整數存儲在不同的列中。
您可以使用類似(如果第一個字母沒有按-T梅特)
ORDER BY CAST(SUBSTRING(場,CHARINDEX(場, ' - ',0)+1,LEN(場)+1 )爲INT)
不是很漂亮,但..
假設你的第一個字符也可能會有所不同:
order by convert(substr(my_field, 1, locate(my_field, '-') - 1) as int),
convert(substr(my_field, locate(my_field, '-') + 1) as int)
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)
如果有對結構進行任何改變都是絕對不可能的,我想說Carl Manaster的方法是最好的。儘管如此,這對大數據集的工作會很慢。
您也可以嘗試添加一個「排序」欄(並建立索引),那麼每一個新的代碼加到你可以計算出它的時候的值,例如:
1-5爲1000 + 5 = 1005 1-14變爲1000 + 14 = 1014
並將其保存到該排序列中。這將工作得更快。 您也可以編寫一個簡單的觸發器,以便自動計算此排序值。
這樣的數據沒有簡單的方法。你能否改變模式以另一種方式存儲數據? – Mark 2011-01-14 15:05:02
所有字段的「1-」是否相同,還是「2-」,「3-」和「10-」?這些確實是日期字段(月份和日期)? 「1-31」是在「2-1」之前還是之後? – rajah9 2011-01-14 15:09:18
@Mark Cant不幸地改變了架構。 @ rajah9那些不是日期,他們是某種代碼。 – Adnan 2011-01-14 15:25:51