仅选择SQL

时间:2017-04-13 13:39:04

标签: sql sql-server sql-server-2008

我在这样的数据库中有字符串:

firstname.lastname@email.com

我只需要在@符号后面和(。)符号之前出现的字符,即上面例子中的(email)

我正在尝试在SQL中找到一种简单的方法。

7 个答案:

答案 0 :(得分:2)

这样做:

use [your_db_name];
go

create table dbo.test
(
    string varchar(max) null
)
insert into dbo.test values ('firstname.lastname@email.com')

select 
    string,
    substring(
        string, 
        charindex('@', string, 0) + 1, 
        charindex('.', string,  charindex('@', string, 0)) - charindex('@', string, 0) - 1
    ) as you_need
from dbo.test

答案 1 :(得分:1)

字符串操作在SQL Server中是如此痛苦。这是一种方法:

select t.*,
       left(en.emailname, charindex('.', en.emailname + '.') - 1)
from t outer apply
     (select stuff(email, 1, charindex('@', email + '@'), '') as emailname) en;

charindex()调用中,被搜索的字符放在字符串的末尾。这使得代码甚至可以用于格式错误的电子邮件 - 当电子邮件的格式不是'%@%.%'时,它会返回一个空字符串。

答案 2 :(得分:1)

DECLARE @str varchar(50) = 'firstname.lastname@email.com';
SELECT LEFT(
         RIGHT(@str, LEN(@str) - CHARINDEX('@', @str))
         ,CHARINDEX('.', RIGHT(@str, LEN(@str) - CHARINDEX('@', @str))
       ) - 1) AS OUTPUT

以上查询仅提供来自电子邮件的域名。该查询可以应用于表中的列

答案 3 :(得分:1)

DECLARE @col char(200) 设置@col ='firstname.lastname@email.com'

SELECT SUBSTRING(@col,LEN(LEFT(@col,CHARINDEX('@',@ col)))+ 1,LEN(@col) - LEN(LEFT(@col,CHARINDEX('@',@ col))) - LEN(右(@col,LEN(@col) - CHARINDEX('。',@ col))) - 4);

答案 4 :(得分:1)

试试这个: -

DECLARE @Text varchar(100)
SET @Text = 'firstname.lastname@email.com'
SELECT SUBSTRING(STUFF(@Text, 1, CHARINDEX('@',@Text), ''), 0, 
CHARINDEX('.', STUFF(@Text, 1, CHARINDEX('@',@Text), '')))

结果: -

email

答案 5 :(得分:0)

DECLARE @myStr varchar(100) = 'firstname.lastname@email.com'

SELECT 
SUBSTRING(SUBSTRING(@myStr,CHARINDEX('@',@myStr)+1,LEN(@myStr)-CHARINDEX('@',@myStr)+1),0,CHARINDEX('.',SUBSTRING(@myStr,CHARINDEX('@',@myStr)+1,LEN(@myStr)-CHARINDEX('@',@myStr)+1)))

这可能很有用,但我真的建议你在C#/ Visaul基础上构建用户定义的函数,它们可以更加快速。

答案 6 :(得分:0)

使用charindex,len和reverse来搜索@和最后一个点的位置 并使用子字符串来获取基于这些位置的名称:

create table test (id int identity(1,1), email varchar(60));

insert into test (email) values 
('jane.doe@email.com'),
('not an email'),
('@invalid.email.xxx'),
('john.doe@longer.domainname.net');

select *, 
 (case 
  when email like '[a-z]%@%.%' 
  then substring(email, 
          charindex('@',email)+1,
          len(email) - charindex('@',email) - charindex('.',reverse(email))
               )
  end) as email_domain_without_extension 
from test;

CASE WHEN用于在不是电子邮件(而不是空字符串)时返回NULL。