C# 使用ibatis.xml映射时,varchar的Oracle SQL order by子句
我试图使用orderspec中的orderby子句使varchar50 colunn正确排序 样本数据:C# 使用ibatis.xml映射时,varchar的Oracle SQL order by子句,c#,xml,oracle,ibatis,C#,Xml,Oracle,Ibatis,我试图使用orderspec中的orderby子句使varchar50 colunn正确排序 样本数据: test123 Test45 47589 Joe 34 Alex 23478 amy Brian 5 brian 4789 它实际上可以是数字和字符的任意组合,最多50个 基本上我需要它来排序: 仅限数字(顺序与长度无关,即1、2、3、10而不是1、10、2、3 然后,它需要根据字符串中的第一个单词按字母顺序排序,不考虑大小写 该列是oracle DB上的varchar50 以下是代码示例
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>
订购人
mcn.my\u列\u名称
$OrderSpec.Direction$
正如您所看到的,我们正在从ui传递排序方向(ASC/DESC)
目前Column上的默认排序没有产生所需的结果,我需要能够相应地调整它
谢谢我对XML和IBATIS的事情不太清楚。但是如果你可以使用
XML
将任何顺序传递给ORACLE
,你需要将字符串的数字部分转换成数字,然后对其排序,然后对字母数字排序。需要使用一些棘手的正则表达式
下面是一个关于这一点的示例。整个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]*')
正如我之前所说的,我不确定如何使用ticks工具,但我猜您的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>
订购人
lpad(到编号(regexp\u substr(mcn.my\u列名称,^[0-9]*')、10、'0'))
||lpad(to_编号(regexp_substr(mcn.my_列名称,[0-9]*$),10,'0'))
||regexp_replace(mcn.my_列名称,[0-9]*'))
$OrderSpec.Direction$
希望它能起作用