C# 使用ibatis.xml映射时,varchar的Oracle SQL order by子句

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 以下是代码示例

我试图使用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

以下是代码示例:

<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$
希望它能起作用