如何将电子邮件地址拆分为多个部分

vin*_*y s 5 sql-server

邮件数据:

Mailid
-------------------------------
venkattaramanan1985@gmail.com
madanraj@gmail.com
Run Code Online (Sandbox Code Playgroud)

预期产量

Name                 DomainName  Extension
-------------------  ----------  ---------
venkattaramanan1985  gmail       com
madanraj             gmail       com
Run Code Online (Sandbox Code Playgroud)

QMa*_*ter 7

它有一个简单的单行解决方案,假设电子邮件地址为admin@system.org,下面的查询将返回所提到的部分:

SELECT 
--admin
LEFT(emailAddres, CHARINDEX('@', emailAddres) - 1) AS accountName  

--system.org
RIGHT(emailAddres, LEN(emailAddres) - CHARINDEX('@', emailAddres)) AS domainWithExtension

--system
LEFT(RIGHT(emailAddres, LEN(emailAddres) - CHARINDEX('@', emailAddres)), CHARINDEX('.', RIGHT(emailAddres, LEN(emailAddres) - CHARINDEX('@', emailAddres))) - 1) AS domain

--org
RIGHT(RIGHT(emailAddres, LEN(emailAddres) - CHARINDEX('@', emailAddres)), LEN(RIGHT(emailAddres, LEN(emailAddres) - CHARINDEX('@', emailAddres))) - CHARINDEX('.', RIGHT(emailAddres, LEN(emailAddres) - CHARINDEX('@', emailAddres)))) AS extension
Run Code Online (Sandbox Code Playgroud)

希望能有所帮助。


cke*_*rth 5

首先,为什么要使用 SQL 服务器呢?

建议使用客户端进行字符串操作,让 SQL 服务器返回数据。对于您的案例,这应该是 SQL 服务器的唯一工作。

如果您真的必须为此使用 SQL 服务器,您可能需要事先阅读如何在 SQL 中拆分字符串。(性能比较请阅读此处

对于以下建议的解决方案,您需要一个表值函数来拆分带有指定分隔符的传递字符串,该分隔符返回有序子字符串。我修改了从这里获取的Common Table Expression以返回排序。

CREATE FUNCTION dbo.SplitStrings_CTE
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS @Items TABLE ([Order] INT IDENTITY(1,1) NOT NULL, [Item] NVARCHAR(4000))
WITH SCHEMABINDING
AS
BEGIN
    --same as the original here, the ordering is inserted automatically by IDENTITY
    (...)
END
Run Code Online (Sandbox Code Playgroud)

现在我添加了一个函数来重新使用上面的函数来拆分电子邮件字符串:

CREATE FUNCTION dbo.SplitEmail
(
   @email NVARCHAR(254)
)
RETURNS @splitted TABLE (
    [Email] NVARCHAR(254),
    [Name] NVARCHAR(254),
    [DomainName] NVARCHAR(254),
    [Extension] NVARCHAR(254)
)
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @name NVARCHAR(254), @domain NVARCHAR(254), @ext NVARCHAR(254)
    --init the email parts with defaults
    SELECT @name = ISNULL(@email, ''), @domain = '', @ext = '';
    --we only want to split @email if at least one '@' is found in it
    IF (@email IS NOT NULL AND LEN(@email) <> 0 AND CHARINDEX('@', @email) <> 0) BEGIN
        --take the last occuring substring from @email as the @domain
        SELECT TOP 1 @domain = [Item]
        FROM [dbo].[SplitStrings_CTE](@name, '@')
        ORDER BY [Order] DESC
        --@email without @domain + '@' is the @name
        SET @name = LEFT(@name, LEN(@name) - LEN(@domain) - 1)
        --we only want to split @domain if at least one '.' is found in it
        IF (CHARINDEX('.', @domain) <> 0) BEGIN
            --take the last occuring substring from @domain as the @ext
            SELECT TOP 1 @ext = [Item]
            FROM [dbo].[SplitStrings_CTE](@domain, '.')
            ORDER BY [Order] DESC
            --split the @ext from the @domain
            SET @domain = LEFT(@domain, LEN(@domain) - LEN(@ext) - 1)
        END
        ELSE BEGIN
            SET @ext = @domain
            SET @domain = ''
        END
    END
    INSERT INTO @splitted ([Email], [Name], [DomainName], [Extension])
    VALUES (@email, @name, @domain, @ext)
    RETURN
END
Run Code Online (Sandbox Code Playgroud)

调用函数 - 例如:

DECLARE @@samples TABLE([mailid] NVARCHAR(255))

INSERT INTO @@samples ([mailid]) VALUES ('venkattaramanan1985@gmail.com')
INSERT INTO @@samples ([mailid]) VALUES ('madanraj@gmail.com')
INSERT INTO @@samples ([mailid]) VALUES ('madanraj@sub.gmail.com')
INSERT INTO @@samples ([mailid]) VALUES ('sm@al.l')
INSERT INTO @@samples ([mailid]) VALUES ('is@sane.')
INSERT INTO @@samples ([mailid]) VALUES ('is@sane')
INSERT INTO @@samples ([mailid]) VALUES ('rubbish@h.h.h.h.h')
INSERT INTO @@samples ([mailid]) VALUES (NULL)
INSERT INTO @@samples ([mailid]) VALUES ('')
INSERT INTO @@samples ([mailid]) VALUES ('invalid')
INSERT INTO @@samples ([mailid]) VALUES ('@@@@@@@@@...')

SELECT e.*
FROM @@samples AS s
CROSS APPLY dbo.SplitEmail(s.mailid) AS e
Run Code Online (Sandbox Code Playgroud)

将返回此结果:

Email                              Name                    DomainName        Extension
---------------------------------  ----------------------  ----------------  ------------
venkattaramanan1985@gmail.com      venkattaramanan1985     gmail             com
madanraj@gmail.com                 madanraj                gmail             com
madanraj@sub.gmail.com             madanraj                sub.gmail         com
sm@al.l                            sm                      al                l
is@sane.                           is                                        sane
is@sane                            is                                        sane
rubbish@h.h.h.h.h                  rubbish                 h.h.h.h           h
NULL                                                                         

invalid                            invalid                                   
@@@@@@@@@...                       @@@@@@@@                ..                
Run Code Online (Sandbox Code Playgroud)