当使用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)。

当前列上的默认排序不能产生期望的结果,我需要能够相应地调整它。

谢谢

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

我不确定XML和IBATIS的事情。但是,如果您可以使用XML传递任何ORDER BYORACLE,则需要将字符串数字部分转换为数字并对其进行排序,然后对字母数字进行排序。需要使用一些复杂的正则表达式。

这里有一个关于这个的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>