在 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 字段中附加前导零的主要内容,如果未能解决你的问题,请参考以下文章