1

我正在尝试使用 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 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)。

目前,列上的默认排序没有产生预期的结果,我需要能够相应地调整它。

谢谢

4

1 回答 1

0

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

希望它有效。

于 2013-06-11T20:22:54.880 回答