我正在尝试使用orderpec中的Order By子句正确排序varchar50 colun
示例数据:
test123
Test45
47589 Joe
34 Alex
23478 amy
Brian 5
brian 4789
它可以是数字和字符的任意组合,最多50个。
基本上我需要它来排序: 仅数字(按顺序排列,无论长度如何,即1,2,3,10而不是1,10,2,3 然后,它需要按字母顺序排序,无论大小写,基于字符串中的第一个单词。
该列是oracle DB上的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)。
目前,colummn上的默认排序没有产生预期的结果,我需要能够相应调整它。
由于
答案 0 :(得分:0)
我不确定XML和IBATIS的事情。但是,如果您可以使用ORDER BY
向XML
传递任何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]*')
正如我之前所说的,我不确定你使用的工具如何使用滴滴答用,但我猜你的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>
希望它有效。