邮件数据:
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)
它有一个简单的单行解决方案,假设电子邮件地址为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)
希望能有所帮助。
首先,为什么要使用 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)
| 归档时间: |
|
| 查看次数: |
12284 次 |
| 最近记录: |