Sql where子句中的大小写表达式语法使得当子查询用作表达式时,子查询返回的值超过1

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

如果我选择Branch code为空,我想编写一些返回所有表记录的代码

但是当我选择分支代码时,它应该只返回特定分支的记录

   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开头,则您的子查询必须始终是完整的查询