使用函数SQL提取不带域扩展的域名
我必须提取只是在电子邮件域名没有域名扩展。例如,我有电子邮件地址katad@hotmail.com我只需要hotmail作为输出,这样我就可以与已知和接受的域列表进行比较 我试着使用它,但它不是我所希望的输出:使用函数SQL提取不带域扩展的域名,sql,sql-server,tsql,Sql,Sql Server,Tsql,我必须提取只是在电子邮件域名没有域名扩展。例如,我有电子邮件地址katad@hotmail.com我只需要hotmail作为输出,这样我就可以与已知和接受的域列表进行比较 我试着使用它,但它不是我所希望的输出: SUBSTRING(subscribers_email,(CHARINDEX('@',subscribers_email)+1),(CHARINDEX('.',subscribers_email))) 第二个例子: 我有电子邮件 d。katana@us.army.mil ,我需要 美
SUBSTRING(subscribers_email,(CHARINDEX('@',subscribers_email)+1),(CHARINDEX('.',subscribers_email)))
第二个例子:
我有电子邮件
d。katana@us.army.mil
,我需要
美国
作为域,与域列表进行比较时,结果将为有效。
第三个例子:
我有作为Dra的电子邮件。Katana@us.army.mil,我需要
美国
当比较时,它应该是有效的,因为某些原因,当前它作为域是空的
这适用于您的示例,如果需要,您可以为其他顶级名称添加其他replace子句
declare @email varchar(100)='katad@hotmail.com'
select Replace(Right(@Email, Len(@Email) - CharIndex('@', @email)),'.com','')
还有一个解决方案
SQL
输出
SQL 2
输出
以下是一个返回第一级域的解决方案,而不考虑任何子域:
Declare @testData Table (email varchar(100));
Insert Into @testData (email)
Values ('katad@hotmail.com'), ('john.m.cappelleti@sub.domain.com'), ('Dra.Katana@us.army.mil'), ('d.katana@us.army.mil');
Select *
, domain = substring(td.email, p1.pos, p2.pos - p1.pos)
From @testData As td
Cross Apply (Values (charindex('@', td.email, 1) + 1)) As p1(pos)
Cross Apply (Values (charindex('.', td.email, p1.pos))) As p2(pos);
样本表的结果:
您需要从以下位置开始搜索:@
交叉应用值对于保存中间值非常有效
选择
子字符串订阅者\u电子邮件,v1.atsign,v2.dot-v1.atsign
从桌子上
交叉应用值NULLIFCHARINDEX'@',订阅者\u电子邮件,0 v1atsign
交叉应用值NULLIFCHARINDEX'.',订阅者\u电子邮件,v1.atsign,0+1 v2dot
因此,我将获得hotmail com,因此我只需要删除hotmail、.com或.net或任何其他需要删除的内容,如果电子邮件地址包含子域,该怎么办?这当然是一个很好的问题,到目前为止,我还没有遇到任何带有子域的电子邮件,不确定在这种情况下我应该做什么真棒@Yitzhak Khabinsky,这很有效,非常感谢@小心点。。。边缘事件,如约翰.m。cappelletti@sub.domain.com如果是@Yitzhak Khabinsky,您会怎么做?@DKCroat,请编辑您的原始问题,并添加示例数据和预期输出。@DKCroat,请尝试SQL 2。
+-------------------+---------+
| email | domain |
+-------------------+---------+
| katad@hotmail.com | hotmail |
+-------------------+---------+
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, email VARCHAR(100));
INSERT INTO @tbl (email) VALUES
('katad@hotmail.com'),
('john.m.cappelletti@sub.domain.com'),
('d.katana@us.army.mil'),
('dra.m.katanad@gmail.com'),
('drazen.i.katanic@abc.com');
-- DDL and sample data population, end
SELECT *
, PARSENAME(SUBSTRING(email, CHARINDEX('@', email) + 1, 100), 2) AS domain
FROM @tbl;
+----+-----------------------------------+---------+
| ID | email | domain |
+----+-----------------------------------+---------+
| 1 | katad@hotmail.com | hotmail |
| 2 | john.m.cappelletti@sub.domain.com | domain |
| 3 | d.katana@us.army.mil | army |
| 4 | dra.m.katanad@gmail.com | gmail |
| 5 | drazen.i.katanic@abc.com | abc |
+----+-----------------------------------+---------+
Declare @testData Table (email varchar(100));
Insert Into @testData (email)
Values ('katad@hotmail.com'), ('john.m.cappelleti@sub.domain.com'), ('Dra.Katana@us.army.mil'), ('d.katana@us.army.mil');
Select *
, domain = substring(td.email, p1.pos, p2.pos - p1.pos)
From @testData As td
Cross Apply (Values (charindex('@', td.email, 1) + 1)) As p1(pos)
Cross Apply (Values (charindex('.', td.email, p1.pos))) As p2(pos);