Sql server 类似的谷歌电子邮件检查重复
谷歌(可能还有其他人)对待Sql server 类似的谷歌电子邮件检查重复,sql-server,tsql,Sql Server,Tsql,谷歌(可能还有其他人)对待foo。bar@gmail.com和foobar@gmail.com与同一邮箱相同 假设我的数据库中有一封用户电子邮件: foo。bar@gmail.com 我想检查是否有新用户尝试注册foobar@gmail.com将无法注册,因为该电子邮件已存在 该场景可能是另一种情况,即用户已经注册了foobar@gmail.com并且一个新的尝试注册到foo。bar@gmail.com。就我而言,电子邮件是平等的,必须是“唯一的” 我试过了 declare @email nva
foo。bar@gmail.com
和foobar@gmail.com
与同一邮箱相同
假设我的数据库中有一封用户电子邮件:
foo。bar@gmail.com
我想检查是否有新用户尝试注册foobar@gmail.com
将无法注册,因为该电子邮件已存在
该场景可能是另一种情况,即用户已经注册了foobar@gmail.com
并且一个新的尝试注册到foo。bar@gmail.com
。就我而言,电子邮件是平等的,必须是“唯一的”
我试过了
declare @email nvarchar(255);
set @newEmail = 'foobar@gmail.com' -- or 'foo.bar@gmail.com'
select * from Users where REPLACE(Users.Email, '.', '') = REPLACE(@newEmail, '.', '')
但这似乎效率不高,可能与域名部分(gmail.com)冲突
有更好的方法吗?我会使用计算列从gmail地址中删除任何点,然后在该列上创建一个唯一键 例如:
DECLARE @Test TABLE (
Email VARCHAR(50) PRIMARY KEY,
ShortEmail AS CONVERT(VARCHAR(50),CASE
WHEN Email LIKE '%@gmail.com' OR Email LIKE '%@googlemail.com'
THEN REPLACE(LEFT(Email,CHARINDEX('@',Email)),'.','')+SUBSTRING(Email,CHARINDEX('@',Email)+1,LEN(Email))
ELSE Email
END) UNIQUE
)
INSERT INTO @Test (Email) VALUES ('a.b@gmail.com'),('a.b@c.com'),('ab@c.com'),('ab.c@gmail.com'),('abc@gmail.com')
我会使用一个计算列删除gmail地址中的任何点,然后在该列上创建一个唯一键 例如:
DECLARE @Test TABLE (
Email VARCHAR(50) PRIMARY KEY,
ShortEmail AS CONVERT(VARCHAR(50),CASE
WHEN Email LIKE '%@gmail.com' OR Email LIKE '%@googlemail.com'
THEN REPLACE(LEFT(Email,CHARINDEX('@',Email)),'.','')+SUBSTRING(Email,CHARINDEX('@',Email)+1,LEN(Email))
ELSE Email
END) UNIQUE
)
INSERT INTO @Test (Email) VALUES ('a.b@gmail.com'),('a.b@c.com'),('ab@c.com'),('ab.c@gmail.com'),('abc@gmail.com')
我可以建议您只比较原始电子邮件字符串吗?毕竟,
foo。bar@gmail.com
不会被视为与foobar@gmail.com
,据我所知。Gmail确实处理foo+bar@gmail.com
和foo@gmail.com
尽管如此。@DavidG也许是,但总的来说,对于其他域,我不确定我们是否可以假设这一点。@TimBiegeleisen确实,我只是指出Gmail是如何做到这一点的(还有一些其他的,但不是太多)。你是绝对正确的。但是,OP可能不应该检查这个。我可以建议你只比较原始的电子邮件字符串吗?毕竟,foo。bar@gmail.com
不会被视为与foobar@gmail.com
,据我所知。Gmail确实处理foo+bar@gmail.com
和foo@gmail.com
尽管如此。@DavidG也许是,但总的来说,对于其他域,我不确定我们是否可以假设这一点。@TimBiegeleisen确实,我只是指出Gmail是如何做到这一点的(还有一些其他的,但不是太多。)你是绝对正确的,不过,那个OP可能不应该检查这个。好主意。但是在测试了上述代码之后,最后一次插入abc@gmail.com
原因:违反唯一密钥约束“UQ_uuu35;BB8DE32_uuubd56945139d5d8fd”。无法在对象“dbo@Test”中插入重复的键。重复的键值为(abc@gmail.com).
如果我正确阅读了您的代码,则不会发生这种情况?这是预期的行为,因为“abc@gmail.com“将是”ab“的副本。c@gmail.com“好的,我现在看到了。谢谢,好主意。但是在测试了上述代码之后,最后一次插入abc@gmail.com
原因:违反唯一密钥约束“UQ_uuu35;BB8DE32_uuubd56945139d5d8fd”。无法在对象“dbo@Test”中插入重复的键。重复的键值为(abc@gmail.com).
如果我正确阅读了您的代码,则不会发生这种情况?这是预期的行为,因为“abc@gmail.com“将是”ab“的副本。c@gmail.com“好的,我现在看到了。非常感谢。