英文:
Extract a particular keyword from string using regexp_substr in Oracle SQL
问题
I want to extract the code next to AC that is 10035.
我想提取AC后面的代码,即10035。
It does give the code but it is not necessary in some of the strings that the code is present at the 5 position.
它确实提供了代码,但并不是在所有字符串中都需要,因为代码可能出现在第5位置。
Like in this string Phone_up_gsk_pdp_AC_90054
it is present in the 6 position.
就像在这个字符串Phone_up_gsk_pdp_AC_90054
中,代码出现在第6位置一样。
Is there a way to use the reg_exp to get only the digits after matching AC. The code will always be of 5 digits.
是否有办法使用正则表达式仅获取匹配AC后面的数字。代码始终是5位数字。
英文:
I have several strings in column Phone_mid_bsnl_AC_10035
and I want to extract the code next to AC that is 10035.
I used this SQL code:
WITH CTE(STR) AS
(
SELECT 'Phone_mid_bsnl_AC_10035'
FROM DUAL
)
SELECT REGEXP_SUBSTR(STR, '[^_]+', 1, 5)
FROM CTE
It does give the code but it is not necessary in some of the strings that the code is present at the 5 position. Like in this string Phone_up_gsk_pdp_AC_90054
it is present in the 6 position. Is there a way to use the reg_exp to get only the digits after matching AC. The code will always be of 5 digits.
答案1
得分: 1
使用以下代码替代:
SELECT REGEXP_SUBSTR(STR, '_(\d{5})(_|$)', 1, 1, null, 1) FROM CTE
Demo 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 |
90054 |
10035 |
null |
英文:
Use
SELECT REGEXP_SUBSTR(STR, '_(\d{5})(_|$)', 1, 1, null, 1) FROM CTE
instead. It will extract first occurence of 5 digits between _
and _
or end of the string.
Demo 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 |
90054 |
10035 |
null |
答案2
得分: 1
也可以使用 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}).*','') FROM CTE
英文:
It also can be done using 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}).*','') FROM CTE
答案3
得分: 0
如果数字值始终位于字符串末尾,则可以简化为
示例数据:
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
: 返回数值字符串,与源字符串末尾“锚定”
英文:
If numeric value is always at the end of a string, then you could simplify it to
sample data:
SQL> with test (col) as
2 (select 'Phone_mid_bsnl_AC_10035' from dual)
Query:
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
: returns string that follows the last underline characterresult_2
: returns numeric string "anchored" to the end of the source string
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论