当使用ibatis.xml映射时,Oracle SQL的varchar order by子句
本文关键字:SQL varchar order 子句 by Oracle ibatis xml 映射 | 更新日期: 2023-09-27 18:17:57
我正在尝试使用orderspec中的Order By子句正确排序varchar50列
样本数据:test123
Test45
47589 Joe
34 Alex
23478 amy
Brian 5
brian 4789
可以是数字和字符的任意组合,不超过50。
基本上我需要它排序:只有数字(与长度无关),例如1,2,3,10,而不是1,10,2,3然后,不管大小写,它需要根据字符串中的第一个单词按字母顺序排序。
该列是oracle数据库上的varchar50。
下面是一个示例代码:
<sql id="order-by-clause">
<isPropertyAvailable property="OrderSpec">
<isNotNull property="OrderSpec">
ORDER BY
<isEqual property="OrderSpec.Property" compareValue="javascriptName">
mcn.my_column_name
</isEqual>
$OrderSpec.Direction$
</isNotNull>
</isPropertyAvailable>
</sql>
正如你所看到的,我们正在从ui传递排序方向(ASC/DESC)。
当前列上的默认排序不能产生期望的结果,我需要能够相应地调整它。
谢谢
我不确定XML和IBATIS的事情。但是,如果您可以使用XML
传递任何ORDER BY
到ORACLE
,则需要将字符串数字部分转换为数字并对其进行排序,然后对字母数字进行排序。需要使用一些复杂的正则表达式。
这里有一个关于这个的SQLFiddle。整个SQL SELECT看起来像这样
select mcn.my_column_name, lpad(to_number(regexp_substr(mcn.my_column_name,'^[0-9]*')),10,'0')
|| lpad(to_number(regexp_substr(mcn.my_column_name,'[0-9]*$')),10,'0')
|| regexp_replace(mcn.my_column_name,'[0-9]*') as sortcrit
from tst
order by lpad(to_number(regexp_substr(mcn.my_column_name,'^[0-9]*')),10,'0')
|| lpad(to_number(regexp_substr(mcn.my_column_name,'[0-9]*$')),10,'0')
|| regexp_replace(mcn.my_column_name,'[0-9]*')
正如我之前所说的,我不确定你是如何使用tick的工具,但我猜你的XML必须看起来像这样:
<sql id="order-by-clause">
<isPropertyAvailable property="OrderSpec">
<isNotNull property="OrderSpec">
ORDER BY
<isEqual property="OrderSpec.Property" compareValue="javascriptName">
lpad(to_number(regexp_substr(mcn.my_column_name,'^[0-9]*')),10,'0')
|| lpad(to_number(regexp_substr(mcn.my_column_name,'[0-9]*$')),10,'0')
|| regexp_replace(mcn.my_column_name,'[0-9]*')
</isEqual>
$OrderSpec.Direction$
</isNotNull>
</isPropertyAvailable>
</sql>