在 QueryContext Oracle 的数字 varchar 字段中附加前导零

Posted

技术标签:

【中文标题】在 QueryContext Oracle 的数字 varchar 字段中附加前导零【英文标题】:Append leading zero in numeric varchar field in QueryContext Oracle 【发布时间】: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 不工作 【参考方案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 并告诉我。

以上是关于在 QueryContext Oracle 的数字 varchar 字段中附加前导零的主要内容,如果未能解决你的问题,请参考以下文章

高级查询query

oracle数字前面补0

oracle中字符串的大小比较,字符串与数字的比较和运算

如何在oracle中将数字丢失100s

Oracle查询在特殊字符后选择单独的字母+数字和数字

什么是“oracle ORA-01722”无效数字?