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

时间:2013-06-11 14:25:59

标签: c# xml oracle ibatis

我正在尝试使用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上的默认排序没有产生预期的结果,我需要能够相应调整它。

由于

1 个答案:

答案 0 :(得分:0)

我不确定XML和IBATIS的事情。但是,如果您可以使用ORDER BYXML传递任何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>    

希望它有效。