2009-06-26 3 views
0

Ich habe eine ziemlich einfache PL/SQL-AbfrageProblem in WHERE-Klausel (weiß nicht, wie ich Ergebnisse von DECODE adressieren kann() Funktion in WHERE-Klausel)

(...) 
DECODE(upper(Table.Column), 'SOMETHING', '---', TABLE2.COLUMN2) as VALUE 
(...) 

Wie kann ich anwenden, die WHERE-Klausel obige Aussage, denn wenn ich so etwas wie:

WHERE upper(VALUE) like 'SOMETHING' 

es mir einen leeren Re-Cord gibt (und ich bin absolut positiv, dass es Aufzeichnungen gibt, die diese Anforderungen erfüllen).

Ich weiß nicht, ob das wichtig ist, aber ich rufe diese Abfrage aus der Excel-Arbeitsmappe, mit VBA und CreateObject("OracleInProcServer.XOraSession").

Antwort

1

Die einfachste Lösung ist das Kopieren und Einfügen.

WHERE upper(DECODE(upper(Table.Column), 'SOMETHING', '---', TABLE2.COLUMN2)) like 'SOMETHING' 

SOMETHING ist keine gute Suchmuster für LIKE though.

+0

Es funktionierte :) Vielen Dank :) 'Etwas' wurde nur hier gesetzt, um dies lesbar zu machen. – zeroDivisible

1

Die Ausgabe der Funktion wäre entweder oder table2.column2.

Diese decode entspricht:

CASE upper(Table.Column) = 'SOMETHING' THEN '---' ELSE TABLE2.COLUMN2 END 

Ich vermute, Sie die Zeilen filtern möchten, die upper(TABLE.Column) = 'SOMETHING', in diesem Fall haben Sie verwenden würden:

WHERE upper(VALUE) = '---' 
5

Das Problem mit dem akzeptierten Lösung ist, dass Sie den DECODE-Ausdruck zweimal ausschreiben müssen. Dies kann ein Wartungsproblem sein, da es die Möglichkeit eröffnet, dass die beiden Instanzen des Ausdrucks irgendwann auseinander gehen.

Eine weitere Möglichkeit besteht darin, Abfragen zu verschachteln, sodass Sie das Ergebnis von DECODE direkt in Ihrem Prädikat verwenden können.

SELECT * FROM (
    SELECT DECODE(upper(Table.Column), 'SOMETHING', '---', TABLE2.COLUMN2) as VALUE 
    FROM ... 
) 
    WHERE UPPER(value) LIKE 'X%' 
+0

Sie sind vielleicht mit diesem Recht, aber ... Ich bin PL/SQL-Neuling mit sehr kleinen Kenntnissen über SQL. Ich habe einfach eine einfachere Lösung gewählt. – zeroDivisible

+0

Absolut richtig, daran dachte ich auch. Aber für einen SQL-Neuling könnte es nur ein bisschen zu viel sein. Wie auch immer, +1 für deine Lösung. –