我有一个触发器,用于检查电子邮件的域是否存在于另一个表(域)中。
表用户:
+------------------+ +------------------+
| 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|
+----------------|------------------|
现在看起来触发器会将第一条记录中的字符数量应用到表格中的所有记录中...... 如何修复触发器以使其工作多行?
答案 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,'@'))