在Oracle SQL中使用regexp_substr从字符串中提取特定关键字

fykwrbwg  于 2023-04-20  发布在  Oracle
关注(0)|答案(3)|浏览(302)

我在Phone_mid_bsnl_AC_10035列中有几个字符串,我想提取AC旁边的代码10035。
我使用了这个SQL代码:

WITH CTE(STR) AS 
(
    SELECT 'Phone_mid_bsnl_AC_10035' 
    FROM DUAL
)
SELECT REGEXP_SUBSTR(STR, '[^_]+', 1, 5) 
FROM CTE

它确实给予了代码,但在某些字符串中,代码不一定出现在5位置。就像在这个字符串Phone_up_gsk_pdp_AC_90054中,它出现在6位置。有没有一种方法可以使用reg_exp在匹配AC后只得到数字。代码将始终是5位数。

g0czyy6m

g0czyy6m1#

也可以使用regexp_replace来完成

WITH CTE(STR) AS (
SELECT 'Phone_mid_bsnl_AC_10035' FROM DUAL union all
SELECT 'Phone_AC_10036_something' FROM DUAL
)
SELECT regexp_replace(STR, '.*AC_([0-9]{5}).*','\1') FROM CTE

Demo here

slsn1g29

slsn1g292#

使用

SELECT REGEXP_SUBSTR(STR, '_(\d{5})(_|$)', 1, 1, null, 1) FROM CTE

它将提取__之间的第一个5位数或字符串的结尾。
演示here

WITH CTE(STR) AS (
SELECT 'Phone_mid_bsnl_A_C_10035' FROM DUAL union all
  SELECT 'Phone_mid_bsnl_AC_10035' FROM DUAL union all
  SELECT 'Phone_up_gsk_pdp_AC_90054' FROM DUAL union all
  SELECT 'Phone_mid_bsnl_A_C_10035_sad' FROM DUAL union all
  SELECT 'Phone_mid_bsnl_A_C_1003' FROM DUAL 
)
SELECT REGEXP_SUBSTR(STR, '_(\d{5})(_|$)', 1, 1, null, 1) a FROM CTE
a
10035
10035
九零五四
10035
tjjdgumg

tjjdgumg3#

如果numeric value总是在字符串的末尾,那么可以将其简化为
样本数据:

SQL> with test (col) as
  2    (select 'Phone_mid_bsnl_AC_10035' from dual)

查询:

3  select substr(col, instr(col, '_', -1) + 1) result_1,
  4         regexp_substr(col, '\d+$') result_2
  5  from test;

RESULT_1   RESULT_2
---------- ----------
10035      10035

SQL>
  • result_1:返回最后一个下划线字符后的字符串
  • result_2:返回“锚定”到源字符串末尾的数字字符串

相关问题