我有一个名称和电子邮件ID的列,如
Column A
ABX <ABX@gmail.com>
hfgfg <shantanu @gmail.com>
我想使用正则表达式只检索名称并排除&lt;&gt;以及来自上一栏的电子邮件ID。
SQL查询中的正则表达式。
我试过
SELECT REPLACE('s <abc@gmail.com>', SUBSTR('s <abc@gmail.com>', instr('(', 's <abc@gmail.com>'), LENGTH('s <abc@gmail.com>') - instr(')', reverse('s <abc@gmail.com>')) - instr('(', 's <abc@gmail.com>') + 2), '')
FROM dual;
答案 0 :(得分:1)
你可以使用正则表达式;要么从第一个开口角支架上移除所有东西,也可以选择修剪任何剩余的空间:
select rtrim(regexp_substr('s <abc@gmail.com>', '[^<]*'), ' ') as name from dual;
或者使用null:
替换尖括号及其中的任何内容以及任何前一个空格select regexp_replace('s <abc@gmail.com>', '\s?<.*>', null) as name from dual;
使用一些示例数据:
with your_table(column_a) as (
select 'Some Name <some.name@example.com>' from dual
union all select 'SingleName <single@example.com>' from dual
)
select column_a,
rtrim(regexp_substr(column_a, '[^<]*'), ' ') as name1,
regexp_replace(column_a, '\s?<.*>', null) as name2
from your_table;
COLUMN_A NAME1 NAME2
--------------------------------- --------------- ---------------
Some Name <some.name@example.com> Some Name Some Name
SingleName <single@example.com> SingleName SingleName
如果您还想要电子邮件地址,可以使用:
select regexp_substr('s <abc@gmail.com>', '([^<>]*)', 1, 3) as email from dual;
......虽然可能有更好的方法。同样嘲笑:
with your_table(column_a) as (
select 'Some Name <some.name@example.com>' from dual
union all select 'SingleName <single@example.com>' from dual
)
select column_a,
rtrim(regexp_substr(column_a, '[^<]*'), ' ') as name1,
regexp_replace(column_a, '\s?<.*>', null) as name2,
regexp_substr(column_a, '([^<>]*)', 1, 3) as email
from your_table;
COLUMN_A NAME1 NAME2 EMAIL
--------------------------------- ---------- ---------- ---------------------
Some Name <some.name@example.com> Some Name Some Name some.name@example.com
SingleName <single@example.com> SingleName SingleName single@example.com
答案 1 :(得分:-1)
为什么不尝试这样的事情:
UPDATE table SET A=TRIM(SUBSTRING(A, 1, INSTR(A,'<')));