如何对包含数字,字符,字符的varchar列(SQL)进行排序?
问题描述:
'订单由' 返回此结果下面如何对包含数字,字符,字符的varchar列(SQL)进行排序?
05/1-1 05/1-2 05/1-3 05/1-4 05/1-5 05/1- 6 05/1-7 5月1日 05/2-1 05/2-2 05/2-3 05/2-4 5月2日 5月3日5月4日和低于此顺序是行
5月1日 05/1-1 05/1-2 05/1-3 05/1-4 05/1-5 05/1-6 05/1-7 5月2日 05/2-1 05/2-2 05/2-3 05/2-4 5月3日5月4日是有办法做到这一点?
答
如果可能,尝试拆分数据,以便任何数字信息都在其自己的字段中。 字段中的字符串数据和数字数据总是会产生字符串类型的数据,因此'A2'>'A11'。
答
您需要将varchar数据转换/转换为数字数据类型,然后通过对数据进行排序来执行排序。
你可能还需要分割你的数据串,所以例如通过caluse顺序可能是:
order by
convert(int,left(columnName,2)) asc,
convert(int,subtring(columnName,4`,2))
这将取决于哪一个字符串元素代表其日期组件。
有意义吗?
答
修改表格并添加一个比较列。编写一个读取字符串的小程序,并将它们转换为数据库可以转换的格式。就你而言,我想DATE是一个很好的候选人。
在一般情况下,使用VARCHAR列并将所有数字格式化为五个(或更多)数字(使用前导零/空格,即右对齐)。
之后,您可以使用比较列来排序数据。
答
如果我是你,我会通过一个棘手的表达命令。我们假设斜线前最多有2或3位数字。如果你写
order by case charindex('/', val)
when 0 then convert(int, val)
else convert(int, substr(val, 1, charindex('/', val) -1)
end * 1000
+ case charindex('/', val)
when 0 then 0
else convert(float, replace(substring(val, 1 + charindex('/', val),
length(val)), '-', '.'))
end
如果我没有任何拼写错误,下面应转换05至5000,5月1日至5001,05/1-1至5001.1,事情应该排序您想要的方式,假设连字符后最多只有一个数字。否则,你可以通过分割和左边填充适当数量的零来解决它,但是表达式会变得更丑陋......