0

WHEN または ELSE のいずれかがサブクエリを返すように、IN() ステートメントに CASE-WHEN ステートメントをネストする方法はありますか。私にとって、それは問題ではないはずですが、どういうわけかエラーが発生しています:

「サブクエリが複数の値を返しました。」

IN()複数の値を処理することになっています!

エラーを再現するための小さな例を次に示します。

-- tblA will be searched for values
Declare @tblA  table (i int)
insert @tblA
    select 1
    union select 2
    union select 3

--tblB: its values will be searched in tblA
Declare @tblB  table (i int)
insert @tblB
    select 2
    union select 3
    union select 1

--@c used by the CASE statement to match
declare @c varchar(50)
set @c = 'Match'

select *
from @tblA
where i IN ( -- IN statement should accept subquery in it
    case @c
        when 'Dont Match' then 2 --If it had matched, then the single value 2 would have been returned and TSQL would be happy
        else (
            select i from @tblB --TSQL not happy and causing error when more than one values returned from the subquery
        )
    end
)
4

3 に答える 3

2

試す

select *
from @tblA A
WHERE (@c = 'Dont Match' AND i = 2) OR 
(@c <> 'Dont Match' AND EXISTS (SELECT * FROM @tblB WHERE i = A.i)
于 2013-09-19T08:04:41.153 に答える
0
IN() is supposed to handle more than one values!

はい、実際にそうです。このようにクエリを変更すると、それを見ることができます

select *
from @tblA
where i IN ( select i from @tblB )

このクエリはエラーなしで実行されます。or句CASEで複数の値を取得できないため、ステートメントによってエラーが生成されました。THENELSE

于 2013-09-19T04:54:49.133 に答える