Sql where子句中的大小写表达式语法使得当子查询用作表达式时,子查询返回的值超过1
如果我选择Branch code为空,我想编写一些返回所有表记录的代码 但是当我选择分支代码时,它应该只返回特定分支的记录Sql where子句中的大小写表达式语法使得当子查询用作表达式时,子查询返回的值超过1,sql,sql-server,select,case,Sql,Sql Server,Select,Case,如果我选择Branch code为空,我想编写一些返回所有表记录的代码 但是当我选择分支代码时,它应该只返回特定分支的记录 declare @BRANCHCODE varchar(4) set @BRANCHCODE='' if (@BRANCHCODE='') begin SELECT ID,BRANCHCODE,BRANCHNAME,DEPARTMENTCODE,DEPARTMENTNAME FROM RATINGLOGS WHERE BRAN
declare
@BRANCHCODE varchar(4)
set @BRANCHCODE=''
if (@BRANCHCODE='')
begin
SELECT ID,BRANCHCODE,BRANCHNAME,DEPARTMENTCODE,DEPARTMENTNAME FROM RATINGLOGS
WHERE BRANCHCODE in (SELECT BRANCHCODE FROM RATINGLOGS)
end
else
begin
SELECT ID,BRANCHCODE,BRANCHNAME,DEPARTMENTCODE,DEPARTMENTNAME FROM RATINGLOGS
WHERE BRANCHCODE=@BRANCHCODE
end
以上代码返回罚款
现在我想在where子句的case语句中使用这个条件。代码如下:
declare
@BRANCHCODE varchar(4)
set @BRANCHCODE=''
SELECT ID,BRANCHCODE,BRANCHNAME,DEPARTMENTCODE,DEPARTMENTNAME FROM RATINGLOGS
WHERE BRANCHCODE in (Case when @BRANCHCODE='' then (SELECT BRANCHCODE FROM RATINGLOGS) else @BRANCHCODE end)
当我设置特定的分支代码时,它返回良好。比如
set @BRANCHCODE='1001'
但它的回归是错误的:
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时
当我使用
set @BRANCHCODE = ''
**这是我提到的
BRANCHCODE in ()
例如,它支持多个值。我不使用=,!=,=。但它出了问题。**
我需要对问题进行解释,如果可能的话,在where子句中使用case语句,重写代码将是什么?在第一次查询中,in条件是多余的-根据定义,从评级日志查询的branchcode必须位于从评级日志中选择的所有branchcodes的列表中,所以你可以完全删除where子句
记住这一点,您可以将第二个代码段中的查询重写为:
SELECT id, branchcode, branchname, depatmentcode, departmentname
FROM ratinglogs
WHERE @branchcode IN (branchcode, '');
case语句只能返回1个值,因此当您使用…然后从ratinglogs中选择branchcode时,它将返回其中的所有值,这是一个错误
如果要将两个查询的逻辑组合为一个查询,则必须使用case逻辑,而不是实际的case语句:
WHERE (
(@BRANCHCODE='' and BRANCHCODE in (SELECT BRANCHCODE FROM RATINGLOGS))
or
(not @BRANCHCODE='' and BRANCHCODE=@BRANCHCODE)
)
您不需要在那里输入操作符,您的查询可以是
SELECT ID,
BRANCHCODE,
BRANCHNAME,
DEPARTMENTCODE,
DEPARTMENTNAME
FROM RATINGLOGS
WHERE 1 = CASE WHEN @BRANCHCODE = '' THEN 1 ELSE 0 END --@BRANCHCODE = ''
OR
BRANCHCODE = @BRANCHCODE;
如果@BRANCHCODE=,上面的代码将返回所有行,如果它持有另一个值,它将返回BRANCHCODE=@BRANCHCODE所在的特定行
由于您询问的是CASE表达式,如果您想使用IN运算符,可以使用@Mureinik提供的另一种解决方案
如果变量@BRANCHCODE可以包含多个值,例如:“100110021003”,那么它将无法按预期工作,需要将字符串拆分为行
SELECT ID,
BRANCHCODE,
BRANCHNAME,
DEPARTMENTCODE,
DEPARTMENTNAME
FROM RATINGLOGS
WHERE BRANCHCODE = ''
OR
BRANCHCODE IN (SELECT Value FROM STRING_SPLIT(@BRANCHCODE, ','));
请注意,该函数仅在SQL Server 2016+版本中可用,如果没有,则需要定义自己的子查询
SELECT ID,
BRANCHCODE,
BRANCHNAME,
DEPARTMENTCODE,
DEPARTMENTNAME
FROM RATINGLOGS
WHERE (@BRANCHCODE = '' or BRANCHCODE = @BRANCHCODE)
如果变量@BRANCHCODE=,则返回所有行,否则只返回BRANCHCODE=@BRANCHCODE的行
由于您仅将@BRANCHCODE声明为varchar4,因此我假定它将始终只包含一个值。
如果您需要它保存多个代码,那么这将不起作用我以后使用过Sql Server,请在相关数据库上标记。如果@BRANCHCODE未以SELECT subquery开头,则您的子查询必须始终是完整的查询