2016-05-31 6 views
0

ich so etwas tun, was gut funktioniert:warum SQL-Case-Fall geben Fehler

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,',',')) 

Aber wenn ich Fall verwenden, um eine Situation zu behandeln, in denen Benutzer dynamisch eintreten ‚‘ anstelle von ‚1,2,3, ". Dann gibt es Fehler in meinem Fall Zustand

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 

Fehler sind:

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

A 'CASE' * Ausdruck * hat zurückzukehren ein Skalarwert (pro Zeile) eines SQL-Datentyps Es kann das Ergebnis der Auswertung eines Prädikats nicht zurückgeben, da dies ein boolescher Wert wäre - und SQL Server hat keinen booleschen Datentyp. –

Antwort

1

Verwenden and und or Bedingungen statt eines case Ausdruck. Der Ausdruck case, wie Sie ihn haben, weist einen Wert zu (else d.nid=1) oder prüft auf eine wahre/falsche Bedingung (d.nid in (select item from SplitString(@selectedAssetTypeID,','))).

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

Entschuldigung konnte noch nicht verstehen .. bitte erklären n mehr Detail .. –

1

Sie können nicht in Klausel mit case Anweisung verwenden. weil Case muss einen Wert pro Anweisung (entweder wahr oder falsch)

entweder Sie können Ihre Abfragen in zwei Blöcke teilen oder Sie können "OR" -Klausel verwenden.

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 

Sie können auch verwenden "OR" -Klausel

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)) 

Link für die Diskussion über das ähnliche Problem ist unter

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