你有
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