Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用函数SQL提取不带域扩展的域名_Sql_Sql Server_Tsql - Fatal编程技术网

使用函数SQL提取不带域扩展的域名

使用函数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 ,我需要 美

我必须提取只是在电子邮件域名没有域名扩展。例如,我有电子邮件地址katad@hotmail.com我只需要hotmail作为输出,这样我就可以与已知和接受的域列表进行比较

我试着使用它,但它不是我所希望的输出:

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);