SQL触发切割电子邮件后@

时间:2017-06-01 10:08:17

标签: sql sql-server sql-server-2016

我有一个触发器,用于检查电子邮件的域是否存在于另一个表(域)中。

表用户:

+------------------+ +------------------+
| email            | | domain           |
+------------------+ +------------------+
| Joe@gmail.com    | | gmail.com        |
| Jack@live.com    | | live.com         |
| Berti@outlook.com| |------------------|
|------------------|

触发器是:

IF EXISTS ( 
            SELECT 1 
            FROM [USER] AS U INNER JOIN inserted AS I 
            ON U.EMAIL = I.EMAIL
            WHERE REPLACE(RIGHT(U.EMAIL, CHARINDEX('@', U.EMAIL)-2),'_',' ') NOT IN (
                SELECT DOMAIN_NAME
                FROM ALLOWED_DOMAIN
            )
        )

触发器无法正常工作,因此我运行了以下查询:

 select REPLACE(RIGHT(U.EMAIL, CHARINDEX('@', U.EMAIL)-2),'_',' '), EMAIL
 from [USER] U 

这给出了以下结果:

| unknown        | email            |
+----------------|---------------   |
| gmail.com      | Joe@gmail.com    | 
| ive.com        | Jack@live.com    |
| ti@outlook.com | Berti@outlook.com|
+----------------|------------------|

现在看起来触发器会将第一条记录中的字符数量应用到表格中的所有记录中...... 如何修复触发器以使其工作多行?

5 个答案:

答案 0 :(得分:2)

这应该是正确的陈述

使用反向和右侧

declare @email as varchar(max) = 'abc@123456.com'

select REPLACE(Right(@email, CHARINDEX('@', reverse(@email))-1),'_',' ')

答案 1 :(得分:2)

试试这个:

drop table if exists dbo.Email;


create table dbo.Email (
    email varchar(100)
);


insert into dbo.Email (email)
values ('Joe@gmail.com')
, ('Jack@live.com')
, ('Berti@outlook.com')

select
  RIGHT(U.EMAIL, len(u.email) - CHARINDEX('@', U.EMAIL))
from dbo.Email u

答案 2 :(得分:2)

问题在于您使用CHARINDEX查找字符串开头的距离,然后使用该字符串从RIGHT函数中的字符串末尾开始计算。

您需要从字符串的长度中减去数字,如此

select REPLACE(RIGHT(U.EMAIL,Len(U.Email) - CHARINDEX('@', U.EMAIL)),'_',' '), EMAIL 
From [User] U

或者只是

select RIGHT(U.EMAIL,Len(U.Email) - CHARINDEX('@', U.EMAIL)), EMAIL
from [USER] U 

答案 3 :(得分:1)

您可以使用SUBSTRING

DECLARE @Val NVARCHAR(100) = 'Berti@outlook.com'
SELECT SUBSTRING(@Val, CHARINDEX('@', @Val, 0) + 1, 1000) -- outlook.com

@字符后,您可以返回所有字符。

答案 4 :(得分:1)

declare @email varchar(50) = 'Berti@outlook.com'
select SUBSTRING(@email, CHARINDEX('@' ,@email) +1 , Len(@email) -  CHARINDEX(@email,'@'))