关于不规则列的排序问题

在日常的开发中会遇到这样的问题,某一列是varchar2类型不是NUMBER类型的,应客户需求要对这样的列进行排序,如果是纯数字或者是纯字符这都不是个难题,问题在于什么都有,如果简单的用to_number(),或者是to_char()来处理的话,不能达到预期的效果。

常见的问题有两种: 

  1.统一用to_number()来处理,当遇到oracle不能转化为数字的时候会报错。例如:

 

2. 统一用to_char()来处理的话,不会报错,但是效果不尽如人意,例如下面所示: 

 

 

为了解决上述两种问题,需要增加一个虚拟列,这列可以用to_number()来排序,达到按数字由大到小的顺序来排列的目的。

首先我们需要明确,如果某一行的该列的值不能转化为数字,应该怎么处理,排在队伍的最前边还是在最后边,我们假设能够转化为数字的居多,这样把不能转化为数字的排在队伍的后边。

为了说得明白一点我们对上述数据做些调整,通过查询语句:

SELECT *FROM t_sort ORDER BY ID ;

得出下面所示的结果:

 

 

 

 现在我们要对上述结果进行排序,首先增加一个伪劣,对不是数字的项进行转化,假如将非数字的列转化为‘9999’则可以这样来进行:

 

 这样的话我们就可以按照col_order这个伪劣来排序,像下面这样: 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

到此问题基本解决了,但是在转化的过程中,对于检测是否是纯数字的问题,还可以可以用下面的函数来实现:DECODE+TRANSLATE+TRIM 来实现:

 

 

 该函数对于较低版本的oracle可同样适用。推荐使用第一种方法,因为第一种方法更方便。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
el-table 的排序规则是根据的数据类型来判断的,所以如果你的内容不是字符串或数字,可能会出现排序错误的问题。 为了解决这个问题,你可以在 el-table 中配置 sorter 函数来自定义排序规则。sorter 函数接收两个参数:rowA 和 rowB,分别代表两条数据行,你需要在该函数中返回一个数字来表示 rowA 和 rowB 的大小关系。例如,如果你要按照日期进行排序,可以将日期转换为时间戳,然后比较时间戳的大小。 下面是一个示例代码,演示如何根据一内容的长度来进行排序: ```html <template> <el-table :data="tableData" :columns="tableColumns"> </el-table> </template> <script> export default { data() { return { tableData: [ { name: "John", age: 23, desc: "This is a long description" }, { name: "Mary", age: 25, desc: "Short" }, { name: "Bob", age: 30, desc: "Medium length" }, ], tableColumns: [ { prop: "name", label: "Name" }, { prop: "age", label: "Age" }, { prop: "desc", label: "Description", sorter: this.sortByLength }, ], }; }, methods: { sortByLength(rowA, rowB) { return rowA.desc.length - rowB.desc.length; }, }, }; </script> ``` 在上面的代码中,我们在 `tableColumns` 中为 `desc` 设置了 `sorter` 函数,该函数比较两条数据的 `desc` 属性的长度,从而实现按照内容长度进行排序的功能。 你可以根据自己的需求,定义不同的 sorter 函数来实现各种自定义排序规则。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值