如何根据条件对Oracle数据库查询结果进行排序?

时间:2014-06-09 13:16:55

标签: oracle sql-order-by

在我的活动表格中,我有一个持续时间列。持续时间可以是几个月,如1米,4米,8米......等等,或者可以是2年,5年,9年等等。在我的查询中,我想根据持续时间按升序编写一个订单。以下是我的询问。

选择活动,活动持续时间

ORDER BY 2

传统的顺序是将结果返回为1m,2y,4m,5y,8m,9y。相反,我希望结果为1m,4m,8m,2y,5y,9y。

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:1)

一般而且针对您的案例:

select blablabla from activities
order by decode(substr(col, len(col)-1, 1), 'm', 1, 'y', 12, 0)*
to_number(substr(col, 1, len(col)-1)

或(直接)

select blablabla from activities
order by decode(col, '1m', 1, '4m', 2, '8m', 3, '2y', 4, '5y', 5, '9y', 6, 7)

或(位置)

select blablabla from activities
order by instr(col, '1m,4m,8m,2y,5y,9y')

或(一般,但简单)

select blablabla from activities
order by substr(col, len(col)-1, 1), substr(col, 1, len(col)-1)

答案 1 :(得分:0)

我建议您最有可能将您的价值转换为数月或数天,以便比较"苹果到苹果"。您应该能够在Select语句中通过将您的月份或年数相乘来相当容易地做到这一点(不幸的是,您必须在这个场景中等待30/31 / x天的月份以及自那以后的365天因为你没有特定的日期,所以不会处理跳跃。

答案 2 :(得分:0)

您可以使用SUBSTR检查单位,然后将其余部分转换为整数(调整单位)以进行排序;

SELECT ACTIVITY,DURATION FROM ACTIVITIES
ORDER BY 
  CASE WHEN SUBSTR(DURATION, -1, 1) = 'y' 
       THEN CAST(SUBSTR(DURATION, 1, LENGTH(DURATION)-1) AS INT) * 12
       ELSE CAST(SUBSTR(DURATION, 1, LENGTH(DURATION)-1) AS INT)
       END;

An SQLfiddle to test with

答案 3 :(得分:0)

SELECT activity, duration
FROM (SELECT activity,
               duration,
               substr(duration, length(duration)) unit,
               to_number(substr(duration, 1, length(duration) - 1)) VALUE
          FROM activities)
ORDER BY unit, VALUE;