我有一个包含像行值的字符串类型的列: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