防止重复'@';通过SQL查询电子邮件地址中的符号

防止重复'@';通过SQL查询电子邮件地址中的符号,sql,Sql,是否存在(SQL中的查询)阻止在电子邮件地址中多次输入“@”符号 或 是否有(SQL中的查询)计算“@”符号出现在电子邮件地址中的次数?在大多数数据库中,您会使用检查约束: create table . . . ( . . . check (Email not like '%@%@%') 或: 如果数据库不支持检查约束,那么您将使用触发器。这可以很容易地转换为存储过程。[sql-2008] 此查询将返回原始文本(电子邮件地址),并且还包括一列,说明地址是否通过了“@”测试。还可

是否存在(SQL中的查询)阻止在电子邮件地址中多次输入“@”符号 或
是否有(SQL中的查询)计算“@”符号出现在电子邮件地址中的次数?

在大多数数据库中,您会使用
检查
约束:

create table . . . (
    . . .
    check (Email not like '%@%@%')
或:


如果数据库不支持检查约束,那么您将使用触发器。

这可以很容易地转换为存储过程。[sql-2008]

此查询将返回原始文本(电子邮件地址),并且还包括一列,说明地址是否通过了“@”测试。还可以修改此基代码,以查看地址字符串中“@”后面的子字符串是否至少有一个“.”

DECLARE @S VARCHAR(50) = 'some_email@site.tld'
DECLARE @testValue AS VARCHAR(50) = @S
DECLARE @PF AS BIT = 'FALSE'
WHILE PatIndex('%[^@]%', @testvalue) > 0
    SET @testValue = Stuff(@testValue, PatIndex('%[^@]%', @testValue), 1, '')
SET @PF = CASE WHEN LEN(@testValue) = 1 THEN 'TRUE' ELSE 'FALSE' END
IF @PF = 'TRUE' SET @PF = CASE WHEN CHARINDEX('.',@S,CHARINDEX('@',@S)) > 0 THEN 'TRUE' ELSE 'FALSE' END
SELECT @S, @PF AS is_valid

如果存在多个@,则@testValue的长度将大于1。@PF var首先验证length=1,否则所有其他值都会失败。下一步@PF if'true'它检查在表示有效格式的“@”后面的地址中是否至少存在1.”。这绝不会验证站点和tld(顶级域)是否存在。

您使用的是什么RDBMS?、SQL Server、MySQL、Oracle、Postgres?…无论如何,最简单的方法是使用
SELECT LEN()的一些变体somestringwithan@inthemiddle)-LEN(替换为somestringwithan@inthemiddle“,”@“,”)
数据是如何进入SQL Server的?修复它似乎比更新SQL中的数据更合适。我将“防止@的多个条目”理解为只允许整个字符串上有一个条目,而不一定需要这样做consecutive@Lamak . . . 这是一个非常好的评论。我修正了逻辑。
DECLARE @S VARCHAR(50) = 'some_email@site.tld'
DECLARE @testValue AS VARCHAR(50) = @S
DECLARE @PF AS BIT = 'FALSE'
WHILE PatIndex('%[^@]%', @testvalue) > 0
    SET @testValue = Stuff(@testValue, PatIndex('%[^@]%', @testValue), 1, '')
SET @PF = CASE WHEN LEN(@testValue) = 1 THEN 'TRUE' ELSE 'FALSE' END
IF @PF = 'TRUE' SET @PF = CASE WHEN CHARINDEX('.',@S,CHARINDEX('@',@S)) > 0 THEN 'TRUE' ELSE 'FALSE' END
SELECT @S, @PF AS is_valid