仅选择SQL中的字符

仅选择SQL中的字符,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在数据库中有如下字符串: 名字。lastname@email.com 我只需要在@符号之后和之前出现的字符。符号,即来自上述示例的电子邮件 我正试图找到一种在SQL中实现这一点的简单方法。字符串操作在SQL Server中是一件非常痛苦的事情。这里有一种方法: select t.*, left(en.emailname, charindex('.', en.emailname + '.') - 1) from t outer apply (select stuff(em

我在数据库中有如下字符串:

名字。lastname@email.com

我只需要在@符号之后和之前出现的字符。符号,即来自上述示例的电子邮件


我正试图找到一种在SQL中实现这一点的简单方法。

字符串操作在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调用中,正在搜索的字符被放置在字符串的末尾。这使得代码即使在格式不正确的电子邮件中也能工作—当电子邮件的格式不是“%@.%”时,它返回一个空字符串。

字符串操作在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调用中,正在搜索的字符被放置在字符串的末尾。这允许代码即使在格式不正确的电子邮件中也能工作-当电子邮件的格式不是“%@.%”时,它返回一个空字符串

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

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

执行以下操作:

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
这样做:

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
声明@col char200 设置@col=”firstname。lastname@email.com"

挑选SUBSTRING@col, LENLEFT@col,CHARINDEX'@',col+1,LEN@col - LENLEFT@col,CHARINDEX'@',col-LENRIGHT@col, LEN@col-CHARINDEX'.',@col-4

声明@col char200
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)))
设置@col=”firstname。lastname@email.com"

挑选SUBSTRING@col, LENLEFT@col,CHARINDEX'@',col+1,LEN@col - LENLEFT@col,CHARINDEX'@',col-LENRIGHT@col, LEN@col-CHARINDEX'.',@col-4

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 basic中构建用户定义的函数,它们可能比这快得多

这可能很有用,但我真的建议您在C/Visaul basic中构建用户定义的函数,它们可能比这快得多。

尝试以下方法:-

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

电子邮件

试试这个:-

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


使用charindex、len和reverse通过电子邮件搜索@和最后一个点的位置。 和子字符串以根据这些位置获取名称:


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

使用charindex、len和reverse搜索@和最后一个点的位置。 和子字符串以根据这些位置获取名称:


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

查看CHARINDEX和SUBSTRINGRelated:可以找到类似的Q&A。希望这有帮助。看看CHARINDEX和SUBSTRINGRelated:可以找到类似的问答。希望这有帮助。