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,'@'))
我有一个触发器,用于检查电子邮件的域是否存在于另一个 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,'@'))