2016-05-31 13 views
0

与える:なぜSQLの場合の条件は、私が正常に動作します。このような何かエラー

select nameOfCols 
from 
FACost 
inner join FAT as D on d.nid=a.atypeid 
and 
d.nid in (select item from SplitString('1,2,3,',',')) 

をしかし、私は、ユーザーが動的に1,2,3「の代わりに」」入力して状況に対処するためにケースを使用する場合、 'そして、それは私の場合の条件にエラーが発生します

declare @selectedAssetTypeID varchar(50)='1,2,3,' 
select nameOfCols 
from 
FACost 
inner join FAT as D on d.nid=a.atypeid 
and 
case when @selectedAssetTypeID<>'' then d.nid in (select item from SplitString(@selectedAssetTypeID,',')) else d.nid=1 end  //error causing lines 

エラーは以下のとおりです。

Msg 156, Level 15, State 1, Line 33 
Incorrect syntax near the keyword 'in'. 
Msg 156, Level 15, State 1, Line 33 
Incorrect syntax near the keyword 'else'. 
+1

'CASE' *表現を下回っている*返すことがありますSQLデータ型のスカラー値(行ごと)。それはブール値であるために述語を評価した結果を返すことはできません.SQL Serverにはブール型のデータ型がありません。 –

答えて

1

使用andor条件の代わりに、case表現。 caseの式は、値(else d.nid=1)を割り当てているか、真偽の条件(d.nid in (select item from SplitString(@selectedAssetTypeID,',')))を確認しています。

and (
(@selectedAssetTypeID <>'' and d.nid in (select item from SplitString(@selectedAssetTypeID,','))) 
or (d.nid=1) 
) 
+0

申し訳ありませんがまだ理解できません。 –

1

あなたはcase文でin句を使用することはできません。 Caseはステートメントごとに1つの値(真または偽)を返さなければならないので、

2つのブロックでクエリを分割するか、 "OR"句を使用できます。

IF @selectedAssetTypeID = " " 
BEGIN 
    select nameOfCols 
    from FACost 
    inner join FAT as D 
     on (d.nid = a.atypeid) 
    where d.nid = 1 
END 
ELSE 
BEGIN 
    select nameOfCols 
    from FACost 
    inner join FAT as D 
     on (d.nid = a.atypeid) 
    where d.nid IN 
    (select item from SplitString(@selectedAssetTypeID,',')) 
END 

あなたが使用することもでき、同様の問題についての議論のための "OR" 句

select nameOfCols 
    from FACost 
    inner join FAT as D 
     on (d.nid = a.atypeid) 
    where ((@selectedAssetTypeID <>'' and d.nid in (select item from SplitString(@selectedAssetTypeID,','))) 
or (d.nid=1)) 

リンクは

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bc8a7a0b-1980-4481-a2df-6a5fde38f362/in-clause-in-case-statement?forum=sqlgetstarted

関連する問題