带Case和Where子句的子查询

时间:2019-09-27 08:45:43

标签: sql

DECLARE @CompanyIds VARCHAR(MAX)
SET @CompanyIds=N'64,62'
SELECT 
   cmp.* 
FROM 
   dbo.Company AS cmp  
WHERE 
   cmp.CompanyId IN ( 
      CASE WHEN IsNull(@CompanyIds,'0') = '0' OR @CompanyIds = '' 
      THEN (cmp.CompanyId)
      ELSE (   
               SELECT 
                  Id 
               FROM 
                  dbo.UDF_DP_SplitString(@CompanyIds,',') 
           ) 
      END
   )

查询给我一条错误消息:

  

子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

但是我需要更多的值,如何处理呢?

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的逻辑,则应该可以完全消除该CASE表达式:

SELECT cmp.*
FROM dbo.Company cmp
WHERE
    (ISNULL(@CompanyIds, '0') = '0' OR @CompanyIds = '') OR
    cmp.CompanyId IN (SELECT Id FROM dbo.UDF_DP_SplitString(@CompanyIds, ','));

CASE表达式(即THENELSE之后的谓词)必须是文字值,而不是另一个逻辑表达式。正如我在上面所写,它使用您想要的相同逻辑,但没有CASE

答案 1 :(得分:1)

您的CASE ELSE条件将在您的WHERE条件下产生多个结果。而是将其转换为子查询。

Declare @CompanyIds Varchar(Max)
Set @CompanyIds=N'64,62'
Select cmp.* From dbo.Company as cmp  Where cmp.CompanyId In
     (Select case when IsNull(@CompanyIds,'0')='0' Or @CompanyIds='' then cmp.CompanyId else t1.ID  
        From dbo.UDF_DP_SplitString(@CompanyIds,',') t1)