Laden...

T-SQL - WHERE Klausel mit CASE + Unterabfrage

Erstellt von Noodles vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.687 Views
N
Noodles Themenstarter:in
4.644 Beiträge seit 2004
vor 17 Jahren
T-SQL - WHERE Klausel mit CASE + Unterabfrage

Hi,

ich habe eine WHERE Klausel, in der ich einen CASE Ausdruck verwende in dem ich wiederum gern eine Subquery ausführen möchte.

SELECT ....
WHERE ...
AND table.myIntColumn IN ( CASE @myVariable
	                        WHEN 0 THEN ( SELECT ID FROM MyOtherTable )
		               ELSE 4 
		         END )

Das funktioniert so nicht.

Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, ≤, > oder ≥ folgt oder als Ausdruck verwendet wird.

Wenn ich anstatt der Unterabfrage eine z.B. 3 eingeben läuft es. Gibt es überhaupt eine Möglichkeit in der Konstellation eine Unterabfrage auszuführen?

Gruß Noodles

476 Beiträge seit 2004
vor 17 Jahren

hallo noodles,

ich hab's aus Interesse eben auch mal ausprobiert. Eine Unterabfrage in der Konstellation müsste schon möglich sein, denn wenn du deine Subquery über eine WHERE-Klausel einschränkst, so dass sie nur einen Wert zurückgibt, funktioniert es (genau wie die 3 anstatt der Subquery).

Es liegt also eher an der CASE-Anweisung, die Probleme hat, mehrere Werte zu verarbeiten. Was hier aber der Unterschied zu einer normalen Subquery ist, würde mich auch interessieren.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

N
Noodles Themenstarter:in
4.644 Beiträge seit 2004
vor 17 Jahren

Also case kann wohl immer nur einen Wert zurückgeben.
Ich habe mir nun vor der Query eine Temporäre Tabelle angelegt. Diese fülle ich anhand der Bedingungen.

CREATE TABLE #TempList ( column int )
IF @myVariable = 0
    INSERT INTO #TempList SELECT ID FROM MyTable
ELSE
    INSERT INTO #TempList ( column ) VALUES ( @myVariable )

Dann frage ich in der WHERE Klausel nur nich die Tabelle ab.

AND table.myIntColumn IN ( SELECT column FROM #TempList )