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
)
查询给我一条错误消息:
子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。
但是我需要更多的值,如何处理呢?
答案 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
表达式(即THEN
或ELSE
之后的谓词)必须是文字值,而不是另一个逻辑表达式。正如我在上面所写,它使用您想要的相同逻辑,但没有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)