gpt4 book ai didi

regex - LPAD 和 REGEXP_REPLACE 交互变得不稳定?

转载 作者:行者123 更新时间:2023-12-05 08:57:17 32 4
gpt4 key购买 nike

这里有一些我无法解释的东西,希望能得到一些帮助,看看我明显遗漏了什么:)

在解决这个问题时: Oracle SQL to Sort Version Numbers

我想聪明的 regexp_replace + LPAD 会产生更好的排序值。然而,出于某种原因,LPAD 一直不正常。这是简化测试中的“问题”:

  with w_data as (
select '9' v from dual union all
select '18' v from dual
)
select v,
lpad(v, 4, '0' ) a,
regexp_replace(v, '([0-9]*)', lpad('\1', 4, '0')) b
from w_data
/

V
--
A
----
B
----------
9
0009
00900

18
0018
001800


2 rows selected.

如您所见,“a”列的行为与预期一致.. 长度为 4 的字符串,左侧填充 0..

但是,一旦它通过 regexp_replace ......它开始变得奇怪......为什么它会这样?我如何“正确地”将它与 regexp_replace 结合使用?(请注意,根据链接的问题,我的正则表达式和字符串有点复杂;))

[编辑]尝试使用“[0-9]+”.. 仍然没有正确填充..

  with w_data as (
select '9' v from dual union all
select '18' v from dual
)
select v,
lpad(v, 4, '0' ) a,
regexp_replace(v, '([0-9]+)', lpad('\1', 4, '0')) b
from w_data
/

V
--
A
----
B
----------
9
0009
009

18
0018
0018


2 rows selected.

请注意,18 正确显示(“0018”),但是,9 显示为“009”只有 3 个字符?应该是四个:"0009"...

最佳答案

如果你确定所有数字都不会超过 4 位,你可以使用这个:

with w_data as (
select '9' v from dual union all
select '18' v from dual
)
select v,
REGEXP_REPLACE(
REGEXP_REPLACE(v, '([0-9]+)', '000\1'),
'(0*)([0-9]{4})',
'\2') b
from w_data

如果不是,这里是更复杂的解决方案:

with w_data as (
select '9' v from dual union all
select '18' v from dual union all
select '123456' v from dual
)
select v,
REGEXP_REPLACE(
REGEXP_REPLACE(v, '([0-9]+)', '000\1'),
'(0*)([1-9]?[0-9]{4})',
'\2') b
from w_data

关于regex - LPAD 和 REGEXP_REPLACE 交互变得不稳定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34001137/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com