2010-07-01 14 views
6

ist es möglich, eine Unterabfrage in einer Fall-Klausel für die Anweisung, wennSQL korrelierte Unterabfrage in einem Fall Klausel

dh zu schreiben.

SELECT colA, colB, 
CASE WHEN (SELECT colA FROM tab2 WHERE tab2.colA = tab1.colA) THEN '1' 
CASE WHEN (SELECT colA FROM tab3 WHERE tab3.colA = tab3.colA) THEN '2' 
ELSE '0' 
END AS colC, 
... 
FROM tab1 

Erweiterte Frage:
Ist es möglich, etwas zu tun, auf der Grundlage dieser Wert Spalte? (ziemlich sicher ja, aber möchte Bestätigung)
dh.

Darüber hinaus ist der obige Fall erlaubt, mehrere und verschiedene Spalten je nach dem Wert ColC zurückgegeben werden?
dh.

CASE 
WHEN colC = '1' THEN (select colR, colV, colX FROM...), 
WHEN colC = '2' THEN (SELECT ColS, ColD FROM...), 
ELSE 'doesn't work' 
END AS colD 

Vielen Dank!

Antwort

4

ist es möglich, eine Unterabfrage innerhalb einer Fallklausel für die, wenn Anweisung

Ich denke, das ist das, was Sie fordern zu schreiben:

SELECT colA, colB, 
     CASE 
      WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
      THEN '1' 
      WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
      THEN '2' 
      ELSE '0' 
     END AS colC 
    FROM tab1; 

Ist es möglich, etwas auf auf diesem Wert colum zu tun n?

Sie dies tun können, die colA verwendet anstatt COLC in der zweiten CASE Ausdruck:

SELECT colA, colB, 
     CASE 
      WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
      THEN '1' 
      WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
      THEN '2' 
      ELSE '0' 
     END AS colC, 
     CASE 
      WHEN colA = '1' THEN (SELECT colA FROM tab2) 
      WHEN colA = '2' THEN (SELECT colB FROM tab3) 
      ELSE 'doesn''t work' 
     END AS colD 
    FROM tab1; 

[Anmerkung Sie Gießen das Ergebnis des zweiten CASE Ausdruck einer gemeinsamen vorsichtig sein müssten Datentyp, vermutlich VARCHAR den ‚doesn''t Arbeit‘ Standardwert unter Berücksichtigung.]

aber ich denke, Sie, ob Sie fragen kann ‚Wiederverwendung‘ ist das Ergebnis eines CASE Ausdrucks in den gleichen SELECT-Klausel, in diesem Fall colC. Die Antwort darauf lautet nein, da der Korrelationsname nicht im Bereich ** liegt. Natürlich könnten Sie wickeln Sie es in einer Unterabfrage (oder CTE, VIEW, usw.):

SELECT DT1.colA, DT1.colB, DT1.colC, 
     CASE 
      WHEN DT1.colC = '1' THEN (SELECT colA FROM tab2) 
      WHEN DT1.colC = '2' THEN (SELECT colB FROM tab3) 
      ELSE 'doesn''t work' 
     END AS colD 
    FROM (  
     SELECT colA, colB, 
       CASE 
        WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
        THEN '1' 
        WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
        THEN '2' 
        ELSE '0' 
       END AS colC 
      FROM tab1 
     ) AS DT1; 

Hinweis

** Ich bin stützen mein Wissen über Standard-SQL statt db2. Mit MS Access können Sie beispielsweise Spaltenkorrelationsnamen in der gleichen SELECT-Klausel von rechts nach links verwenden, was jedoch bestätigt, dass Access die SQL-Sprache nicht implementiert!


ist der obige Fall erlaubt mehrere und verschiedene Spalten zurück je nachdem, welcher Wert COLC ist

Verschiedene Spalten ja, mehrere Spalten nicht. Denken Sie darüber nach: Der Ausdruck CASE gibt einen Wert zurück, also welcher Datentyp wäre ein Wert zwei Spalten? Tabelle, Liste, Array usw.? Skalare Werte sind eine Voraussetzung für 1NF.

+0

Danke für den Vorschlag und die Erklärung. – Tyug

2

Fallanweisungen werden als einzelner Wert ausgewertet, daher können Sie nicht mehrere Spalten von ihnen zurückgeben. Sie können korrelierte Unterabfragen in Ihrer Where-Klausel verwenden, obwohl Sie kein Beispiel zeigen, in dem Sie versucht haben, dieses zu verwenden. Ob colC in der WHERE-Klausel funktioniert, hängt von Ihrem Datenbankmodul ab. Ich habe mit einigen anderen Tools gearbeitet, die Sie benötigen, um die Unterabfrage in der WHERE-Klausel erneut auszuführen.

+0

Danke für die Erklärung! Nur ein FYI funktioniert es für DB2. – Tyug

1

ist es möglich, eine Unterabfrage in einem Fall-Klausel für die Anweisung, wenn

Ja zu schreiben. Wie g.d.d.c geantwortet hat, muss es eine Unterabfrage sein, die einen einzelnen Wert zurückgibt. Das bedeutet null oder eine Zeile und eine Spalte oder einen Wert.

Ist es möglich, etwas basierend auf dieser Wertespalte zu tun?

Ja, mit den gleichen Vorbehalten wie oben.

Kann der obige Fall außerdem mehrere und unterschiedliche Spalten zurückgeben, je nachdem, welchen Wert colC hat?

Nein. Die Unterabfrage muss null oder eine Zeile und nur eine Spalte oder einen Wert zurückgeben.

Verwandte Themen