仅选择SQL中的字符
我在数据库中有如下字符串: 名字。lastname@email.com 我只需要在@符号之后和之前出现的字符。符号,即来自上述示例的电子邮件仅选择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
我正试图找到一种在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:可以找到类似的问答。希望这有帮助。