我有一个字符串firstname.lastname@domain.com
,我想将字符串分解为3列。
我尝试了使用RTRIM
,SUBSTR
和REGEXP_SUBSTR
的几种变体,但没有成功。任何帮助都会有所帮助。
答案 0 :(得分:0)
使用Parsename,Charindex,Right和Replace MSSQL 2012+(用于Parsename功能)
declare @myemail varchar(50) = 'firstname.lastname@domain.com'
select parsename(replace(@myemail,right(@myemail,charindex('@',reverse(@myemail))),''),2) [firstname],
parsename(replace(@myemail,right(@myemail,charindex('@',reverse(@myemail))),''),1) [Lastname],
right(@myemail,charindex('@',reverse(@myemail))) [Domain]
答案 1 :(得分:0)
您尚未指定正在使用的数据库,因此我将在SQL Server中回答此问题:
SELECT SUBSTRING(q.email, 1, CHARINDEX('.', q.email) - 1) AS firstname,
SUBSTRING(q.email, CHARINDEX('.', q.email) + 1, CHARINDEX('@', q.email) - CHARINDEX('.', q.email) - 1) AS lastname,
SUBSTRING(q.email, CHARINDEX('@', q.email) + 1, LEN(q.email)) AS domain
FROM (SELECT 'firstname.lastname@domain.com' AS email) q
这是fiddle。我只是为了演示而硬编码表,但当然你会从你自己的表中选择。此查询假定所有数据都遵循相同的模式。
如果您更喜欢使用LEFT
和RIGHT
:
SELECT LEFT(q.email, CHARINDEX('.', q.email) - 1) AS firstname,
SUBSTRING(q.email, CHARINDEX('.', q.email) + 1, CHARINDEX('@', q.email) - CHARINDEX('.', q.email) - 1) AS lastname,
RIGHT(q.email, LEN(q.email) - CHARINDEX('@', q.email)) AS domain
FROM (SELECT 'firstname.lastname@domain.com' AS email) q
这是fiddle。
答案 2 :(得分:0)
有几种方法可以做到这一点。像其他人提到的那样,它还取决于您正在处理的数据库。
这是使用SUBSTR,INSTR,REVERSE,LENGTH函数组合的oracle版本。
SELECT 'FIRST_NAME.LASTNAME@domain.com' "FULL NAME" ,
SUBSTR('FIRST_NAME.LASTNAME@domain.com', 0, (INSTR('FIRST_NAME.LASTNAME@domain.com', '.')-1) ) "FIRST NAME ",
SUBSTR('FIRST_NAME.LASTNAME@domain.com' , (INSTR('FIRST_NAME.LASTNAME@domain.com' , '.')+1), LENGTH(SUBSTR('FIRST_NAME.LASTNAME@domain.com', (INSTR('FIRST_NAME.LASTNAME@domain.com', '.')+1) )) - INSTR(REVERSE('FIRST_NAME.LASTNAME@domain.com'), '@')) as "LAST NAME",
SUBSTR('FIRST_NAME.LASTNAME@domain.com' , (INSTR('FIRST_NAME.LASTNAME@domain.com', '@')+1)) "DOMAIN NAME"
FROM DUAL
希望这有帮助!