Sql Server - 如何排序除字母数字以外的其他数据

时间:2011-06-07 13:56:57

标签: sql sql-server

在Sql Server 2008中我有一个数据库表,数据包含一个字段,表示一个时间段:2d,1w,4y,其中“d”=天,“w”=周,“y” =年。基于此字段排序的最佳方法是什么,以便它们按时间顺序排列(例如“1y”之前的“3w”)?

由于

4 个答案:

答案 0 :(得分:2)

我猜你很幸运,d在w之前,W也在y之前,所以你可以做到

ORDER BY RIGHT(MyField, 1), CONVERT(int, LEFT(Field, LEN(Field) - 1))

然而,例如,这不会在8d之前放置1w。

所以另一种(更复杂的)解决方案可能是

ORDER BY 
   CASE RIGHT(Field, 1)
       WHEN 'd' THEN LEFT(Field, LEN(Field) - 1)
       WHEN 'w' THEN 7*LEFT(Field, LEN(Field) - 1)
       ELSE 356 * LEFT(Field, LEN(Field) - 1)
   END 

它假设你的数据(例如只有d,w和y会在那里),并没有考虑闰年(如果重要的话)。

答案 1 :(得分:2)

您可能会有不同的时间段。所以我会将这些时段放在一个新的表中,其中包含ID,时间段和排序顺序(或天数)。在初始表中,将字段替换为time_period_id,并在查询中进行连接,并在SORT BY中使用它。

答案 2 :(得分:1)

用字符串编号替换字符,并在排序前转换为整数,如:

convert(int, replace(replace(replace(myField,'d',''),'w','0')'y','00'))

所以你的3D是3,2w是20而4y是400。


在考虑了一下之后,通过案例表达来计算实际值会更好。例如得到14的2w,小于13d。

答案 3 :(得分:0)

我的方法是编写一个函数来解析你的持续时间字符串,并以可以表达的最小可能单位对其进行标准化(我假设它是几天,但如果你可以有几小时或一些较小的单位表达,请使用那)。然后,有一个计算列,该列是针对您的列调用的函数的值。那时,这只是比较数字的问题。当然,细节中的魔鬼......我不喜欢尝试解析T-SQL中的文本。