SQL查询返回不符合WHERE条件的记录,原因是什么?
问题分析:查询返回意外邮箱记录的原因及修复方案
嗨,我来帮你捋捋这个问题——你明明要查的是emailfromsomeone@hotmail.com,结果却跑出一条两个邮箱都是'e'的记录,这确实是个隐蔽的小坑!
咱们先看你的SQL代码里最关键的问题:
问题根源:变量长度未指定
你声明变量的时候写的是declare @email as varchar,在SQL Server里,如果varchar不指定长度,默认只会分配1个字符的存储空间。这就意味着,当你给@email赋值'emailfromsomeone@hotmail.com'时,它只能存下第一个字符'e',剩下的全被截断了!
这直接导致你的WHERE条件完全跑偏:原本应该匹配完整邮箱,现在变成了匹配任何邮箱字段(转小写后)等于'e'的记录,那条销售人员操作失误的记录正好撞中这个条件,所以被查出来了。
修复方案:给变量指定足够长度
只需要给@email变量加上合适的长度就行,邮箱一般不会超过255个字符,修改后的代码如下:
declare @email as varchar(255) -- 指定足够的长度,避免截断 set @email = 'emailfromsomeone@hotmail.com' select C.[No_], C.[First Name] firstname, C.[Surname] lastname, C.[E-Mail] as email, C.[E-Mail 2] as email_2, C.[GDPR Opt-in] as GDPR_opt_in, C.[Salesperson Code] as sales_person from [Contact] as C where lower(C.[E-Mail]) = lower(@email) or lower(C.[E-Mail 2]) = lower(@email)
额外小建议:如果你的业务需要支持带特殊字符的邮箱(比如包含非英文字母的邮箱),可以把varchar换成nvarchar(255),这样能更好地兼容Unicode字符。
内容的提问来源于stack exchange,提问作者WouldBeNerd
相关产品推荐
相关产品推荐

