SQL将字符串解析为字段

时间:2017-12-19 23:24:41

标签: sql

我有一个字符串firstname.lastname@domain.com,我想将字符串分解为3列。

  • 第1列 - 名字
  • 第2栏 - 姓氏
  • 第3栏 - domain.com

我尝试了使用RTRIMSUBSTRREGEXP_SUBSTR的几种变体,但没有成功。任何帮助都会有所帮助。

3 个答案:

答案 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。我只是为了演示而硬编码表,但当然你会从你自己的表中选择。此查询假定所有数据都遵循相同的模式。

如果您更喜欢使用LEFTRIGHT

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

希望这有帮助!