使用 Reg_exp

如何使用 oracle REGEXP_SUBSTR 从电子邮件中提取名字和姓氏,

电子邮件:susan.ryan@email.com

预期输出:

名字 姓氏
苏珊 ryan
select
  substr('susan.ryan@email.com',1,(INSTR('susan.ryan@email.com','.')-1)) first_name,substr('susan.ryan@email.com','.')+1),'@'))) last_name
from dual;

但我得到的结果是

first_name 姓氏
苏珊 ryan@email.
xiaotong11 回答:使用 Reg_exp

你有

substr(email,instr(email,'.') + 1,'@')) as last_name

但是第二个参数不是结束位置,而是请求的长度,所以必须减去点的位置:

substr(email,'@') - instr(email,'.') - 1) as last_name

顺便说一下,使用 REGEXP_SUBSTR 会更容易:

regexp_substr(email,'[[:alpha:]]+',1,1) as first_name,regexp_substr(email,2) as last_name

我们在这里寻找仅由电子邮件中的字母组成的子字符串。对于 first_name 我们取第一个这样的字符串,对于 last_name 取第二个。这当然依赖于您表中的所有电子邮件同样由 firstname.lastname@domain 组成。

这是关于 REGEXP_SUBSTR 的文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/REGEXP_SUBSTR.html#GUID-2903904D-455F-4839-A8B2-1731EF4BD099

,

以下是有关如何执行此操作的一些示例。首先使用 SUBSTR(列“域”)或 REGEXP(列“domain_regexp”)删除域,然后使用 REGEXP_SUBSTR 拆分域之前的部分(列“no_domain”):

WITH samples AS
(
  SELECT '-susan.ryan@email.com' as str FROM DUAL UNION
  SELECT 'roger@email.com' as str FROM DUAL
)
SELECT 
str as email,REGEXP_SUBSTR(str,'@.+$') AS domain_regexp,SUBSTR(str,INSTR(str,'@')) as domain,'@') - 1) as no_domain,REGEXP_SUBSTR(SUBSTR(str,'@') - 1),'[^.]+',1) AS first_name,2) AS last_name
from samples;

EMAIL                 DOMAIN_REGEXP         DOMAIN                NO_DOMAIN             FIRST_NAME            LAST_NAME            
--------------------- --------------------- --------------------- --------------------- --------------------- ---------------------
-susan.ryan@email.com @email.com            @email.com            -susan.ryan           -susan                ryan                 
roger@email.com       @email.com            @email.com            roger                 roger                                      


本文链接:https://www.f2er.com/10810.html

大家都在问