2011-01-14 209 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

并将其保存到该排序列中。这将工作得更快。 您也可以编写一个简单的触发器,以便自动计算此排序值。