SQL 在@之后触发剪切电子邮件

SQL trigger cutting email after @

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

Table 用户:

+------------------+ +------------------+
| 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|
+----------------|------------------|

现在看起来触发器将第一条记录中的字符数应用到 table 中的所有记录... 我怎样才能修复触发器,使其适用于多行?

您可以使用 SUBSTRING

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

@ 个字符之后你可以 return 所有字符。

这应该是正确的说法

使用反向和右

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

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

试试这个:

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

问题是您正在使用 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 
declare @email varchar(50) = 'Berti@outlook.com'
select SUBSTRING(@email, CHARINDEX('@' ,@email) +1 , Len(@email) -  CHARINDEX(@email,'@'))