Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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 如何将CASE语句放入子字符串语句中?_Sql Server_Tsql_Substring_Case_Where - Fatal编程技术网

Sql server 如何将CASE语句放入子字符串语句中?

Sql server 如何将CASE语句放入子字符串语句中?,sql-server,tsql,substring,case,where,Sql Server,Tsql,Substring,Case,Where,这样做的目的是,我试图比较两个电子邮件地址的用户名,看看它们是否相同。真的,我只想让它起作用 运行查询时,得到的结果是:传递给LEFT或SUBSTRING函数的长度参数无效 declare @ReportParameter1 nvarchar(16) set @ReportParameter1 = 'manmoon@test1.com' declare @ReportParameter2 nvarchar(16) set @ReportParameter2 = '' select 'test'

这样做的目的是,我试图比较两个电子邮件地址的用户名,看看它们是否相同。真的,我只想让它起作用

运行查询时,得到的结果是:传递给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)
注意:我更改了查询。这更好地说明了我要做的事情。 注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))
WHERE(子字符串(@ReportParameter1,1,case-when(CHARINDEX('@',@ReportParameter1)-1)<1然后是1-else-CHARINDEX('@',@ReportParameter1)-1 end)=子字符串(@ReportParameter2,1,CHARINDEX('@',@ReportParameter2)-1))

将子字符串放在。。。您基本上希望在一个案例中使用静态值。。。另一方面。。。使用“else”上的子字符串


将子字符串放入案例中。。。您基本上希望在一个案例中使用静态值。。。另一方面。。。使用“else”上的子字符串


错误源于未将
子字符串的结果与任何内容进行比较。字符串不是布尔表达式

编辑: 既然你编辑了你的问题,这个答案就没有任何意义了

我用空字符串测试了您的子字符串表达式,没有得到任何错误。另一方面,如果您的字符串不是空的,但不包含任何
@
字符,则会出现您描述的错误

要处理此问题,您可以这样做:

... 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'
,因此您可能希望在表达式中使用不同的回退值

编辑2: 仔细想想,如果检查@字符,则不需要检查空字符串,因为空字符串不能包含@字符:

... 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

错误源于未将
子字符串的结果与任何内容进行比较。字符串不是布尔表达式

编辑: 既然你编辑了你的问题,这个答案就没有任何意义了

我用空字符串测试了您的子字符串表达式,没有得到任何错误。另一方面,如果您的字符串不是空的,但不包含任何
@
字符,则会出现您描述的错误

要处理此问题,您可以这样做:

... 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'
,因此您可能希望在表达式中使用不同的回退值

编辑2: 仔细想想,如果检查@字符,则不需要检查空字符串,因为空字符串不能包含@字符:

... 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

您在WHERE子句中错误地使用了SUBSTRING函数。您正在使用它,就好像您希望它返回true/false一样。你不想把它等同于某个东西吗(例如:子字符串(…)=“abc”)?所有关于子字符串的代码都很好,除了
WHERE
子句中的最后一个
和()
,你应该在它附近放置一些布尔条件,这是我问题的一部分。我现在遇到的是实际问题。我应该先把它贴出来。我道歉。我对每个人的答案都进行了评分。再次感谢。您在WHERE子句中错误地使用了SUBSTRING函数。您正在使用它,就好像您希望它返回true/false一样。你不想把它等同于某个东西吗(例如:子字符串(…)=“abc”)?所有关于子字符串的代码都很好,除了
WHERE
子句中的最后一个
和()
,你应该在它附近放置一些布尔条件,这是我问题的一部分。我现在遇到的是实际问题。我应该先把它贴出来。我道歉。我对每个人的答案都进行了评分。再次感谢你,问题是。。。“如何将CASE语句放入子字符串语句中?”。。。第二个问题是他的where子句缺少布尔表达式。我的意思是他不需要把这个案子放在子串里。。。我回答了这个问题。。。这不是问题所在。隐马尔可夫模型。。。也许我们只是在吹毛求疵。不,这是标题,但公平地说,标题看起来像一个完整的问题,虽然它不应该,而且这个问题实际上并不包含一个问题……这个问题是。。。“如何将CASE语句放入子字符串语句中?”。。。第二个问题是他的where子句缺少布尔表达式。我的意思是他不需要把这个案子放在子串里。。。我回答了这个问题。。。这不是问题所在。隐马尔可夫模型。。。也许我们只是在吹毛求疵。不,这是标题,但公平地说,标题看起来像一个完整的问题,虽然它不应该,而且这个问题实际上并不包含一个问题……你是绝对正确的。复制和粘贴是魔鬼的工作。看来我的答案和你的一样。虽然你的更强壮。无论如何,你得到支票。这正是我所说的。。。不过道具给了古芙一个冲洗出来的完整答案!你完全正确。复制和粘贴是魔鬼的工作。看来我的答案和你的一样。虽然你的更强壮。无论如何,你得到支票。这正是我所说的。。。不过道具给了古芙一个冲洗出来的完整答案!