2012-07-10 40 views
1

我有具有以下行的SQL Server表列:SELECT查询排序由子在SQL服务器

MyColumn:

1 Month 
2 Week 
10 Minutes 
1 week 
12 hours 
1 days 
2 month 
2 day 
5 minutes 
1 hours 

它是一个包含字符串的优先级文本列。

有没有办法做一个选择回这列排序如下:

10 Minutes 
5 minutes 
1 hours 
10 Hours 
1 day 
2 days 
1 week 
2 weeks 
1 month 
2 months 

等。

谢谢

+0

我认为这将是一个相当复杂的查询条件。可能的话,您应该添加另一个表,并将您的字符串映射到秒,例如,并根据此表中的值进行排序。 – 2012-07-10 07:47:31

+4

期望的排序似乎很奇怪,因为它是递减的持续时间单位长度,但在每个组内上升。这绝对是你想要的吗? – 2012-07-10 07:51:50

+2

你可以有6周吗?如果是这样,应该在1个月以上但不到2个月? – Sean 2012-07-10 08:00:42

回答

0
order by case when patindex('%Month', MyColumn) > 0 
       then 0 
       when patindex('%week', MyColumn) > 0 
       then 1 
       when patindex('%days', MyColumn) > 0 
       then 2 
       when patindex('%Minutes', MyColumn) > 0 
       then 3 
     end, 
     cast(substring(MyColumn, 1, CHARINDEX(' ', MyColumn)) as int) 
+1

您需要从MyColumn中提取数字值,否则它会在“11个月”前排序“1个月” – Sean 2012-07-10 07:53:47

+0

它正在工作,谢谢 – 2012-07-10 09:16:41

1

尝试这种解决方案:

SELECT mycolumn 
FROM tbl 
ORDER BY 
    SUBSTRING(mycolumn, PATINDEX('%[^0-9]%', mycolumn)+1, 999), 
    CAST(LEFT(mycolumn, PATINDEX('%[^0-9]%', mycolumn)-1) AS INT) 

SQL-Fiddle Demo

0
select T4.cnt +' '+T4.name from (   
select substring(name, 1, CHARINDEX(' ', name)) cnt,substring(name,CHARINDEX(' ', name)+1,LEN(name)) name from test4) T4  
left outer join (
select 1 as id,'Month' As name union all 
select 2 as id,'Week' As name union all 
select 3 as id,'Day' As name union all 
select 4 as id,'Minutes' As name)T6 
on t4.name=t6.name 
order by t6.id,t4.cnt 

你必须给的顺序您在左表希望所有的不同的值(月,周等)与“UNION ALL”