Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 类似的谷歌电子邮件检查重复_Sql Server_Tsql - Fatal编程技术网

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“好的,我现在看到了。非常感谢。