在SQL

问题描述:

只选择字符

我有一个字符串在这样的数据库:(。)在SQL

[email protected]

,我只需要在@符号之后和之前出现的字符符号即从上面的例子(电子邮件)

我想在SQL中找到一个简单的方法来做到这一点。

+4

看看CHARINDEX()和SUBSTRING() – etsa

+1

相关:http://*.com/questions/20984617/how-to-get-string-between-two-characters – DenStudent

+1

类似的问答可以在这里找到[这里] (http://*.com/a/40425080/7812927)。
希望这有助于。 – BigMacMenu

被应用于列操作:

use [your_db_name]; 
go 

create table dbo.test 
(
    string varchar(max) null 
) 
insert into dbo.test values ('[email protected]') 

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

字符串操作在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()呼叫,所搜索的被放置在字符串的末尾的字符。这使代码甚至可以处理格式错误的电子邮件 - 当电子邮件的格式不是'%@%.%'时,它会返回一个空字符串。

DECLARE @str varchar(50) = '[email protected]'; 
SELECT LEFT(
     RIGHT(@str, LEN(@str) - CHARINDEX('@', @str)) 
     ,CHARINDEX('.', RIGHT(@str, LEN(@str) - CHARINDEX('@', @str)) 
     ) - 1) AS OUTPUT 

上面的查询只给出了来自Email的域名。该查询可以在表

DECLARE @col炭(200) 组@col = '[email protected]'

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

DECLARE @myStr varchar(100) = '[email protected]' 

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基础上建立用户定义的函数,他们可以更快地这样做。

试试这个: -

DECLARE @Text varchar(100) 
SET @Text = '[email protected]' 
SELECT SUBSTRING(STUFF(@Text, 1, CHARINDEX('@',@Text), ''), 0, 
CHARINDEX('.', STUFF(@Text, 1, CHARINDEX('@',@Text), ''))) 

结果: -

email

使用CHARINDEX,LEN和反向搜索的@的位置和最后一个点。
和substring基于这些位置来获取名称:

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

insert into test (email) values 
('[email protected]'), 
('not an email'), 
('@invalid.email.xxx'), 
('[email protected]'); 

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; 

当使用返回NULL时,它不是一个电子邮件(而不是一个空字符串)的情况下。