'Order by'会在
下面返回此结果05 05/1-1 05/1-2 05/1-3 05/1-4 05/1-5 05/1-6 05/1-7 05/1 05/2-1 05/2-2 05/2-3 05/2-4 05/2 05/3 05/4
以下订单可以
05 05/1 05/1-1 05/1-2 05/1-3 05/1-4 05/1-5 05/1-6 05/1-7 05/2 05/2-1 05/2-2 05/2-3 05/2-4 05/3 05/4
有办法做到这一点吗?
答案 0 :(得分:1)
如果可能,请尝试拆分数据,以便任何数字信息都在其自己的字段中。 字段中的字符串数据和数字数据将始终产生字符串类型的数据,因此'A2'> 'A11'。
答案 1 :(得分:1)
您需要将varchar数据转换/转换为数字数据类型,然后通过对数据进行排序来执行订单。
您可能还需要拆分数据字符串,因此按caluse排序的示例可能是:
order by
convert(int,left(columnName,2)) asc,
convert(int,subtring(columnName,4`,2))
这取决于哪些字符串元素代表哪些日期组件。
有意义吗?
答案 2 :(得分:0)
更改表格并添加比较列。编写一个小程序,读取字符串并将其转换为数据库可以转换的格式。在你的情况下,DATE是一个很好的候选人,我想。
在一般情况下,使用VARCHAR列并将所有数字格式化为五个(或更多)数字(前导零/空格,即右对齐)。
之后,您可以使用比较列对数据进行排序。
答案 3 :(得分:0)
如果我是你,我会通过一个棘手的表达来命令。让我们假设在斜线之前你最多有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,05 / 1至5001,05 / 1-1至5001.1,并且应该按照您想要的方式进行排序,假设您始终只有一位数字连字符后最多。否则你可以通过使用适当数量的零分割和左边填充来解决它,但表达式会变得更加丑陋......