在 oracle sql 中使用正则表达式从逗号分隔的字符串中提取数字
Extract a number from comma separated string using regular expressions in oracle sql
我正在尝试获取以逗号分隔的字符串中以 628 开头的数字。
以下是我正在使用的:
SELECT
REGEXP_REPLACE(REGEXP_SUBSTR('62810,5152,,', ',?628[[:alnum:]]+,?'),',','') first,
REGEXP_REPLACE(REGEXP_SUBSTR('5152,62810,,', ',?628[[:alnum:]]+,?'),',','') second,
REGEXP_REPLACE(REGEXP_SUBSTR('5152,562810,,', ',?628[[:alnum:]]+,?'),',','') third,
REGEXP_REPLACE(REGEXP_SUBSTR(',5152,,62810', ',?(628[[:alnum:]]+),?'),',','') fourth
FROM DUAL;
它可以工作,但在一种情况下它失败了,即第三列,其中数字为 562810。实际上我希望第三列为 NULL。
上述查询的实际输出是:
"FIRST","SECOND","THIRD","FOURTH"
"62810","62810","62810","62810"
您的正则表达式逻辑存在问题,您正在搜索数字 628
前的 可选 逗号。这意味着任何具有 628
的数字都会匹配。相反,您可以通过查找 628
来表达这一点,628
前面有逗号, 或 字符串的开头。
SELECT
REGEXP_REPLACE(REGEXP_SUBSTR('62810,5152,,', '(,|^)628[[:alnum:]]+,?'),',','') first,
REGEXP_REPLACE(REGEXP_SUBSTR('5152,62810,,', '(,|^)628[[:alnum:]]+,?'),',','') second,
REGEXP_REPLACE(REGEXP_SUBSTR('5152,562810,,', '(,|^)628[[:alnum:]]+,?'),',','') third,
REGEXP_REPLACE(REGEXP_SUBSTR(',5152,,62810', '(,|^)(628[[:alnum:]]+),?'),',','') fourth
FROM DUAL
我们想在这里使用的理想模式是 \b628.*
,或者类似的东西。但是 Oracle 的正则表达式函数似乎不支持单词边界,因此我们可以使用 (^|,)628.*
作为替代。
不确定您为什么要使用 [[:alnum::]]
。您可以使用匹配组来提取以 628 开头或后跟逗号的数字。 REPLACE
这样可以避免
如果您也有字母表,请相应地修改第二个匹配组 ()
。
SELECT
REGEXP_SUBSTR('62810,5152,,' , '(^|,)(628\d*)',1,1,NULL,2) first,
REGEXP_SUBSTR('5152,62810,,' , '(^|,)(628\d*)',1,1,NULL,2) second,
REGEXP_SUBSTR('5152,562810,,', '(^|,)(628\d*)',1,1,NULL,2) third,
REGEXP_SUBSTR(',5152,,62810' , '(^|,)(628\d*)',1,1,NULL,2) fourth
FROM DUAL;
我正在尝试获取以逗号分隔的字符串中以 628 开头的数字。 以下是我正在使用的:
SELECT
REGEXP_REPLACE(REGEXP_SUBSTR('62810,5152,,', ',?628[[:alnum:]]+,?'),',','') first,
REGEXP_REPLACE(REGEXP_SUBSTR('5152,62810,,', ',?628[[:alnum:]]+,?'),',','') second,
REGEXP_REPLACE(REGEXP_SUBSTR('5152,562810,,', ',?628[[:alnum:]]+,?'),',','') third,
REGEXP_REPLACE(REGEXP_SUBSTR(',5152,,62810', ',?(628[[:alnum:]]+),?'),',','') fourth
FROM DUAL;
它可以工作,但在一种情况下它失败了,即第三列,其中数字为 562810。实际上我希望第三列为 NULL。
上述查询的实际输出是:
"FIRST","SECOND","THIRD","FOURTH"
"62810","62810","62810","62810"
您的正则表达式逻辑存在问题,您正在搜索数字 628
前的 可选 逗号。这意味着任何具有 628
的数字都会匹配。相反,您可以通过查找 628
来表达这一点,628
前面有逗号, 或 字符串的开头。
SELECT
REGEXP_REPLACE(REGEXP_SUBSTR('62810,5152,,', '(,|^)628[[:alnum:]]+,?'),',','') first,
REGEXP_REPLACE(REGEXP_SUBSTR('5152,62810,,', '(,|^)628[[:alnum:]]+,?'),',','') second,
REGEXP_REPLACE(REGEXP_SUBSTR('5152,562810,,', '(,|^)628[[:alnum:]]+,?'),',','') third,
REGEXP_REPLACE(REGEXP_SUBSTR(',5152,,62810', '(,|^)(628[[:alnum:]]+),?'),',','') fourth
FROM DUAL
我们想在这里使用的理想模式是 \b628.*
,或者类似的东西。但是 Oracle 的正则表达式函数似乎不支持单词边界,因此我们可以使用 (^|,)628.*
作为替代。
不确定您为什么要使用 [[:alnum::]]
。您可以使用匹配组来提取以 628 开头或后跟逗号的数字。 REPLACE
这样可以避免
如果您也有字母表,请相应地修改第二个匹配组 ()
。
SELECT
REGEXP_SUBSTR('62810,5152,,' , '(^|,)(628\d*)',1,1,NULL,2) first,
REGEXP_SUBSTR('5152,62810,,' , '(^|,)(628\d*)',1,1,NULL,2) second,
REGEXP_SUBSTR('5152,562810,,', '(^|,)(628\d*)',1,1,NULL,2) third,
REGEXP_SUBSTR(',5152,,62810' , '(^|,)(628\d*)',1,1,NULL,2) fourth
FROM DUAL;