ORACLE按条件排序的例子

本文介绍了一种用于约会案件的特定排序查询方法,该方法首先将当天的约会案件置于最前,然后从未处理过的案件中筛选,并按上次处理的时间升序排列。

需求: 当天约会的案件在最前面--> 从未处理过的案件--> 上次处理时间由小到大排序(即越近催收的案件在越后面)

即: (col_case.case_app_date=sysdate)-->(col_case.case_lst_col_date is null)-->(col_case.case_lst_col_date)

select case when trunc(t.case_app_date)=trunc(sysdate) then '1'
            when t.case_lst_col_date_str is null then '2'
            else '3' end as column1,t.*
from
(
 SELECT  V_COLOVERVIEW_FULL.* FROM V_COLOVERVIEW_FULL WHERE MCOL_ID='zhangq'
OR(AGENT_ID='zhangq' AND AGENT_STATUS='AgentStatus_Agree'
AND AGENT_DATE_FROM<=SYSDATE AND AGENT_DATE_TO>=SYSDATE)
)
t
order by column1,case_lst_col_date_str asc 

 

 博文来源:http://blog.youkuaiyun.com/huanghui22/archive/2006/12/25/1460474.aspx

### Oracle 数据库中按照固定顺序进行排序的方法 在 Oracle 数据库中,可以通过多种方式实现按照固定的顺序进行排序。以下是几种常见的方法及其具体实现: #### 方法一:使用 `INSTR` 函数 `INSTR` 是 Oracle 中的一个字符串操作函数,可以用来查找子串的位置。如果需要按照某个字段的值在一个预定义序列中的位置进行排序,则可以利用此函数。 示例代码如下: ```sql SELECT D_SORT, D_TEXT FROM BR_DICT WHERE D_TYPE LIKE '%状态%' ORDER BY INSTR('321054', CAST(D_SORT AS NCHAR)) DESC; ``` 这段代码的作用是根据字段 `D_SORT` 的值在字符串 `'321054'` 中首次出现的位置来进行排序[^2]。需要注意的是,如果没有匹配到任何字符,默认会返回 0,因此可能需要额外处理未匹配的情况。 --- #### 方法二:使用 `DECODE` 函数 `DECODE` 是 Oracle 提供的一种条件判断函数,类似于 SQL Server 中的 `CASE WHEN` 结构。它可以根据输入值映射为同的输出值,从而实现自定义排序逻辑。 示例代码如下: ```sql SELECT D_SORT, D_TEXT FROM BR_DICT WHERE D_TYPE LIKE '%状态%' ORDER BY DECODE(D_SORT, '3', '1', '2', '2', '1', '3', '0', '4', '5', '5', '4', '6'); ``` 在这段代码中,`DECODE` 将字段 `D_SORT` 的同取值映射成新的数值,并以此作为排序依据。这种方法适用于已知所有可能值并希望为其分配特定权重的情形。 --- #### 方法三:嵌套查询与虚拟列 当排序规则较为复杂时,也可以通过创建临时表或视图的方式引入辅助列完成排序任务。例如,在外层查询中基于内层计算的结果执行最终排序。 示例代码如下: ```sql SELECT * FROM ( SELECT AREA, CASE SUBSTR(AREA, 0, 4) WHEN '1410' THEN 1 ELSE NULL END AS PRIORITY_1, CASE SUBSTR(AREA, 0, 2) WHEN '14' THEN 2 ELSE NULL END AS PRIORITY_2 FROM ( SELECT '140000' AS AREA FROM DUAL UNION ALL SELECT '141000' AS AREA FROM DUAL UNION ALL SELECT '141100' AS AREA FROM DUAL UNION ALL SELECT '151000' AS AREA FROM DUAL UNION ALL SELECT '152200' AS AREA FROM DUAL ) ) T ORDER BY COALESCE(PRIORITY_1, 99), COALESCE(PRIORITY_2, 99); ``` 这里我们首先在外层查询中定义两个优先级列 (`PRIORITY_1`, `PRIORITY_2`) 来表示同的排序层次;随后再调用 `COALESCE` 函数确保即使某些记录缺少某一层级的信息也会影响整体排序效果[^4]。 --- #### 方法四:结合窗口函数 对于更高级的应用场景,还可以考虑采用窗口函数(Window Functions),比如 ROW_NUMBER(), RANK() 或者 DENSE_RANK() 等来动态生成排序键值后再做进一步调整。 示例代码如下: ```sql WITH SORTED_DATA AS ( SELECT AREA, ROW_NUMBER() OVER (PARTITION BY TRUNC(LENGTH(AREA)/2) ORDER BY AREA ASC) RNK FROM ( SELECT '140000' AS AREA FROM DUAL UNION ALL SELECT '141000' AS AREA FROM DUAL UNION ALL SELECT '141100' AS AREA FROM DUAL UNION ALL SELECT '151000' AS AREA FROM DUAL UNION ALL SELECT '152200' AS AREA FROM DUAL ) ) SELECT * FROM SORTED_DATA ORDER BY RNK; ``` 该例子展示了如何根据同长度分组后的区域编码重新编号以达到定制化展示的目的[^4]。 --- ### 总结 以上介绍了四种主要的 Oracle 自定义排序方案——分别是借助于内置函数 `INSTR` 和 `DECODE` ,以及更加灵活复杂的 CTE/子查询结构配合窗体运算符共同作用达成目标。实际应用过程中应综合考量业务需求、性能开销等因素选取最适合当前环境的技术手段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值