2017-10-24 3 views
0

Eine Darstellung der Abfrage, mit der ich arbeite, lautet wie folgt.So verschachteln Sie eine CASE-Anweisung in einer WHERE-Klausel und geben mehrere Werte zurück

SELECT T1.Col3 
FROM Table1 T1 
WHERE T1.Col1 IN ('Value1','Value2') 
    AND (CASE 
      WHEN T1.Col1 = 'Value1' 
       THEN T1.Col2 IN ('Value3','Value4','Value5') 
      WHEN T1.Col1 = 'Value2' 
       THEN T1.Col2 IN ('Value6','Value7','Value8') 
      END 
     ) 

Ich bekomme immer einen Fehler mit der Syntax um die Sekunde wenn aus irgendeinem Grund. Ich bekomme auch einen Syntaxfehler am ersten Komma in beiden IN-Anweisungen, aber nicht die zweite. Nicht, dass es ein macht einen Unterschied machen sollte, ich habe auch versucht, die verschachtelten IN-Anweisung zu einer OR-Anweisung wie folgt Wechsel:

THEN (T1.COL2 = 'Value3') OR (T1.COL2 = 'Value4') OR (T1.COL2 = 'Value5') 

Stattdessen bekomme ich einen Syntaxfehler um die erste OR-Anweisung.

Ich habe CASE in einer WHERE-Klausel verwendet, aber es gab nur einen Wert zurück. Die Tatsache, dass ich bei der ersten Komma- oder ODER-Anweisung einen Syntaxfehler erhalte, lässt mich vermuten, dass die Rückgabe mehrerer Werte nicht möglich ist.

Jedes Licht, das Sie auf dieses Problem werfen könnten, wird sehr geschätzt.

P.S. Ich habe bereits eine Arbeit an Ort und Stelle, indem Sie eine temporäre Tabelle erstellen und bedingte DELETE-Anweisungen ausführen, die das gleiche Ergebnis erzielen, das ich mit der obigen CASE-Anweisung versuche. Ich bin jedoch neugierig, zu wissen, ob die andere Methode, die diese Frage betrifft, möglich ist.

Antwort

2

können Sie die WHERE Kriterien vereinfachen wie unten:

SELECT T1.Col3 
FROM Table1 T1 
WHERE 
(
    (T1.Col1 = 'Value1' AND T1.Col2 IN ('Value3','Value4','Value5')) 
    OR 
    (T1.Col1 = 'Value2' AND T1.Col2 IN ('Value6','Value7','Value8')) 
) 

Die gleiche Abfrage separate Abfragen geschrieben, wie 2 mit einem UNION werden könnte: aber

SELECT T1.Col3 
FROM Table1 T1 
WHERE T1.Col1 = 'Value1' 
AND T1.Col2 IN ('Value3','Value4','Value5') 

UNION -- note that this will return distinct results 

SELECT T1.Col3 
FROM Table1 T1 
WHERE T1.Col1 = 'Value2' 
AND T1.Col2 IN ('Value6','Value7','Value8') 

Hinweis, dass ein WHERE mit OR Klauseln kann zu einem teuren Abfrageplan führen. Wenn die Abfrage sehr teuer ist, könnte ein abdeckenden Index für diese Abfrage helfen:

CREATE INDEX IX_Table1_Col1_Col2_Incl ON Table1 (Col1, Col2) INCLUDE (Col3) 
1
Select col3 
From tab 
Where col1 = 'val1' and col2 in ('val3', 'val4') or 
      col1 = 'val2' and col2 in ('val5', 'val6') 
Verwandte Themen