【问题标题】:Append leading zero in numeric varchar field in QueryContext Oracle在 QueryContext Oracle 的数字 varchar 字段中附加前导零
【发布时间】:2020-02-12 09:27:51
【问题描述】:

我正在从事一个春季项目,其中以升序或降序应用排序。列类型是 varchar。此字段将包含数值十进制或数字两者。它可能包含字母和数字的组合(添加此类值的机会可能较少)。由于这是客户的要求,所以我不能更改列的数据类型。

假设 myNum 字段的值为:

  • 2.12
  • 0.11
  • 0.45
  • 1.7
  • A12
  • 4.80
  • B34
  • 0.56

排序后,它应该在上显示数字,然后在下显示字母:

  • 0.11
  • 0.45
  • 0.56
  • 1.7
  • 2.12
  • 4.80
  • A12
  • B34

创建要排序的查询的代码是:

 queryContext.getSorts().forEach((s) -> {
                if (orderByClauses.length() > 0) {
                    orderByClauses.append(", ");
                }
                if (s.getColumnName().equalsIgnoreCase("myNum")) {                    
                    orderByClauses.append("regexp_substr(myNum, '^\\D*') nulls first, to_number(regexp_substr(myNum, '\\d+\\.?\\d*'))");                   
                } else {
                    orderByClauses.append(s.getColumnName() + " ");   
                }
                orderByClauses.append(s.getDirection().toString());
            });

上述示例的代码工作正常,但情况是当我添加 .34 或 .56(小数点前没有前导零)时,排序无法正常工作。

如何将零添加到 regexp_substr 以获得正确的结果?

【问题讨论】:

  • regexp_replace(str, '^\.', '0.') ?
  • @PonderStibbons 不工作

标签: java oracle spring-boot


【解决方案1】:

如果您使用的是 Oracle 12.2 或更高版本,则可以利用 TO_NUMBER 函数和 ORDER BY 子句中的 ON CONVERSION ERROR 子句,如下所示:

TO_NUMBER(myNum DEFAULT 999999999 ON CONVERSION ERROR), MYNUM  -- Your orderByClauses

--更新

对于较低版本的oracle,使用regexp_like如下

CASE WHEN REGEXP_LIKE(myNum, '^[\.|[:digit:]]+$') THEN 1 ELSE 2 END 
,MYNUM -- Your orderByClauses

干杯!!

【讨论】:

  • 我们使用的是 Oracle 12c,上述子句不适用于我的 to_number。
  • 能否请您在这里查看您的解决方案:sqlfiddle.com/#!4/43875/1 并告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2015-10-20
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多