我想使用正则表达式函数从字符串中提取第二个点(。)之前的文本,例如:
I want to extract text before second dot(.) using regexp function from string like :
我想从字符串中提取第二个点 (.) 之前的文本,例如:
Input - XYZ.ABC.MNO.CZ
Output- XYZ.ABC
Input - AWQ.QA
Output- AWQ.QA
看起来你想要除了点之外的任何东西,然后是点,然后是除了点之外的任何东西:
with t (v) as (
select 'XYZ.ABC.MNO.CZ' from dual union all
select 'AWQ.QA' from dual
)
select regexp_substr(v,'[^\.]+\.[^\.]+') from t;
使用SUBSTR + INSTR
组合(在大型数据集上可能比正则表达式表现更好):
SQL> with test (col) as
2 (select 'XYZ.ABC.MNO.CZ' from dual union all
3 select 'AWQ.QA' from dual
4 )
5 select col,
6 substr(col, 1, case when instr(col, '.', 1, 2) = 0 then length(col)
7 else instr(col, '.', 1, 2) - 1
8 end
9 ) result
10 from test;
COL RESULT
-------------- --------------
XYZ.ABC.MNO.CZ XYZ.ABC
AWQ.QA AWQ.QA
SQL>
此正则表达式处理点分隔字符串的元素为 NULL 的情况。基本上匹配任何内容,一个文字点,然后是任何后跟文字点或字符串结尾的内容。 Return 第一组。请注意,如果未找到匹配项(REGEXP_REPLACE return 原始字符串),REGEXP_SUBSTR 将 return NULL。
WITH T (ID, v) AS (
SELECT 1, 'XYZ.ABC.MNO.CZ' FROM dual UNION ALL
SELECT 2, '.ABC.MNO.CZ' FROM dual UNION ALL
SELECT 3, 'XYZ..MNO.CZ' FROM dual UNION ALL
SELECT 4, 'AWQ.QA' FROM dual
)
SELECT ID, REGEXP_SUBSTR(v,'(.*?\..*?)(\.|$)', 1, 1, NULL, 1) substring
FROM T
ORDER BY ID;
ID SUBSTRING
---------- --------------
1 XYZ.ABC
2 .ABC
3 XYZ.
4 AWQ.QA
4 rows selected.
始终在数据中使用意外条件进行测试。
我想从字符串中提取第二个点 (.) 之前的文本,例如:
Input - XYZ.ABC.MNO.CZ
Output- XYZ.ABC
Input - AWQ.QA
Output- AWQ.QA
看起来你想要除了点之外的任何东西,然后是点,然后是除了点之外的任何东西:
with t (v) as (
select 'XYZ.ABC.MNO.CZ' from dual union all
select 'AWQ.QA' from dual
)
select regexp_substr(v,'[^\.]+\.[^\.]+') from t;
使用SUBSTR + INSTR
组合(在大型数据集上可能比正则表达式表现更好):
SQL> with test (col) as
2 (select 'XYZ.ABC.MNO.CZ' from dual union all
3 select 'AWQ.QA' from dual
4 )
5 select col,
6 substr(col, 1, case when instr(col, '.', 1, 2) = 0 then length(col)
7 else instr(col, '.', 1, 2) - 1
8 end
9 ) result
10 from test;
COL RESULT
-------------- --------------
XYZ.ABC.MNO.CZ XYZ.ABC
AWQ.QA AWQ.QA
SQL>
此正则表达式处理点分隔字符串的元素为 NULL 的情况。基本上匹配任何内容,一个文字点,然后是任何后跟文字点或字符串结尾的内容。 Return 第一组。请注意,如果未找到匹配项(REGEXP_REPLACE return 原始字符串),REGEXP_SUBSTR 将 return NULL。
WITH T (ID, v) AS (
SELECT 1, 'XYZ.ABC.MNO.CZ' FROM dual UNION ALL
SELECT 2, '.ABC.MNO.CZ' FROM dual UNION ALL
SELECT 3, 'XYZ..MNO.CZ' FROM dual UNION ALL
SELECT 4, 'AWQ.QA' FROM dual
)
SELECT ID, REGEXP_SUBSTR(v,'(.*?\..*?)(\.|$)', 1, 1, NULL, 1) substring
FROM T
ORDER BY ID;
ID SUBSTRING
---------- --------------
1 XYZ.ABC
2 .ABC
3 XYZ.
4 AWQ.QA
4 rows selected.
始终在数据中使用意外条件进行测试。