2016-09-02 4 views
1

I, in einer gespeicherten Prozedur mit @input als Eingabewert, eine case-Anweisung in einer where-Klausel wie diese verwenden mag:SQL Server: CASE-Anweisung in WHERE-Klausel mit IN-Bedingung

SELECT my_column 
FROM MY_TABLE 
WHERE MY_TABLE.my_column in (CASE WHEN @input = '1' THEN ('A','B','C') ELSE ('A') END) 

Unglaublich, es funktioniert, wenn ich nach „DANN“ wie dies nur einen Wert legen:

SELECT my_column 
FROM MY_TABLE 
WHERE MY_TABLE.my_column in (CASE WHEN @input = '1' THEN ('C') ELSE ('A') END) 

Kann ich den IN Zustand mit einer CASE Anweisung, wie ich oben wollte? Gibt es einen anderen Weg, um zu tun, was ich will?

Vielen Dank für Ihre Hilfe,

CLJ

+0

'CASE' in T-SQL ist ein ** Ausdruck ** (wie' a + b ') - keine * Erklärung * - was letztlich wird durch einen einzigen atomaren Wert ersetzt –

Antwort

3

das Problem bei der ersten Abfrage ist, dass CASE kehrt nur ein skalarer Wert. Es kann keine Werteliste zurückgegeben werden.

Stattdessen können Sie einfach OR verwenden:

SELECT my_column 
FROM MY_TABLE 
WHERE (@input = '1' and MY_TABLE.my_column IN ('A','B','C')) 
     OR 
     (@input <> '1' and MY_TABLE.my_column = 'A') 
+0

Könnten Sie bitte klarstellen, warum es nicht funktioniert .... WHERE my_column in (@getval). SELECT @getval gibt die Zeichenfolge 'A', 'B', 'C' zurück. – p2k

+0

@ Pinwar13 ''A', 'B', 'C' 'ist * nicht * eine * einzige * Datenkette. Es ist stattdessen ein * Set * von drei separaten String-Werten. 'CASE' * kann * keine Werte zurückgeben. –

+0

Danke !, Dies ist nur für mein Lernen. Ich verstehe, dass CASE Werte nicht zurückgeben kann. deklariere @getval varchar (100) = FALL WENN input = '1' DANN ('' 'A' ',' 'B' ',' 'C' '') ELSE ('A') ENDE. Hier kann ich die Zeichenfolge 'A', 'B', 'C' von CASE bekommen. – p2k