我的目的是尝试比较两个电子邮件地址的用户名,看看它们是否相同。真的,我想要的就是让它发挥作用。
当我运行查询时,我得到的是:传递给LEFT或SUBSTRING函数的长度参数无效。
注意:我更改了查询。这更好地说明了我试图做的事情。 注意2:我已经进行了更改以使其正常工作,但现在如果参数是'',那么我得到:传递给LEFT或SUBSTRING函数的无效长度参数。
declare @ReportParameter1 nvarchar(16)
set @ReportParameter1 = 'manmoon@test1.com'
declare @ReportParameter2 nvarchar(16)
set @ReportParameter2 = ''
select 'test'
where SUBSTRING (case @ReportParameter1 when '' then 'x@' else @ReportParameter1 end, 1, Charindex('@', case @ReportParameter1 when '' then 'x@' else @ReportParameter1 end) - 1) =
SUBSTRING (case @ReportParameter2 when '' then 'x@' else @ReportParameter2 end, 1, Charindex('@', case @ReportParameter2 when '' then 'x@' else @ReportParameter2 end) - 1)
这是我用来解决问题的where子句。但是,这将教会我在复制和粘贴时要更加小心。
WHERE (substring(@ReportParameter1, 1, case when (CHARINDEX('@', @ReportParameter1) - 1) < 1 then 1 else CHARINDEX('@', @ReportParameter1) - 1 end) = SUBSTRING(@ReportParameter2, 1, CHARINDEX('@', @ReportParameter2) - 1))
答案 0 :(得分:2)
把子串放在案例中...你基本上想要一个案例的静态值...另一个...使用“else”上的子串
case GPS_Quotes.[Sales Engineer]
when
'' then 'some constant value'
else
substring(GPS_Quotes.[Sales Engineer], 1, ...{I don't understand what your are trying to do})
end
答案 1 :(得分:2)
错误来自于不将substring
的结果与任何内容进行比较。字符串不是布尔表达式。
既然您已经编辑了问题,那么这个答案就没有任何意义了。
我用空字符串测试了你的子串表达式,我没有得到任何错误。另一方面,如果您的字符串不为空,但不包含任何@
字符,则会出现您描述的错误。
要处理你可以这样做:
... where case
when @ReportParameter1 = '' or charindex('@', @ReportParameter1) = 0 then 'x'
else substring(@ReportParameter1, 1, charindex('@', @ReportParameter1) - 1)
end =
case
when @ReportParameter2 = '' or charindex('@', @ReportParameter2) = 0 then 'x'
else substring(@ReportParameter2, 1, charindex('@', @ReportParameter2) - 1)
end
但请注意,不是电子邮件地址的两个字符串会比较为'x' = 'x'
,因此您可能希望在表达式中使用不同的回退值...
想想看,如果检查@字符,则不需要检查空字符串,因为空字符串不能包含@字符:
... where case
when charindex('@', @ReportParameter1) = 0 then 'x'
else substring(@ReportParameter1, 1, charindex('@', @ReportParameter1) - 1)
end =
case
when charindex('@', @ReportParameter2) = 0 then 'x'
else substring(@ReportParameter2, 1, charindex('@', @ReportParameter2) - 1)
end