2017-10-20 1 views
0

Hallo Ich versuche, basierend auf einem Kriterium für einen unserer Datenblöcke auswählen. Sie haben die Wahl einer -All-Wahl und ich habe Probleme, sie zum Laufen zu bringen oder besser zu funktionieren.Verbessern von Oracle Where-Klausel mit Gleichen oder in Werten

Wie ich es jetzt ist dies aber es scheint wirklich klobig und ich denke, manchmal tut es einige Werte abholen

where SLRRDEF_RDEF_CODE = (select CASE 
        WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'A100' 
        WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'A110' 
        WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'B100' 
        WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'B110' 
        WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'B120' 
        WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'B130' 
        WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'W110' 
        WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'W590' 
        ELSE :parm_dd_rdef.RDEF_CODE 
        END from dual 

Ich möchte etwas für die effiziente wie dies versuchen, aber ich bekomme immer fehlt Klammern/Keyword-Fehler und ich glaube nicht, dass das etwas damit zu tun hat. Würde jemand in der Lage

where (CASE 
     WHEN :parm_dd_rdef.RDEF_DESC like '-All-' THEN SLRRDEF_RDEF_CODE in ('A100','A110','B100','B110','B120','B130','W110','W590') 
     WHEN :parm_dd_rdef.RDEF_DESC not like '-All-' THEN SLRRDEF_RDEF_CODE = :parm_dd_rdef.RDEF_CODE 
     END) 
     AND 

where SLRRDEF_RDEF_CODE in (CASE WHEN :parm_dd_rdef.RDEF_DESC like '-All-' 
THEN ('A100','A110','B100','B110','B120','B130','W110','W590') 
ELSE :parm_dd_rdef.RDEF_CODE) 
+0

wo in (subquery) oft besser ausgedrückt als eine innere Verknüpfung. Mind Sharing das vollständige SQL-Skript? – Twelfth

+0

leider nicht, da ich im Grunde damit beauftragt bin, dieses Ding nach und nach zu überarbeiten und zu versuchen, das zu verbessern, was der Benutzer als erstes wünscht - das ist die Auswahl aller Codes oder die individuelle Auswahl –

Antwort

3

case wirklich helfen soll, damit Sie Boolesche Logik an Orten zu verwenden, wo es normalerweise nicht erlaubt. Da die where-Klausel in erster Linie auf Boolescher Logik basiert, gibt es normalerweise eine Fehlantwort, die eine case-Anweisung verwendet.

Es ist schwer, genau zu sagen, was Sie erreichen wollen, aber ein bisschen Interpolation ich denke, das die bessere Lösung für Ihr Szenario sein kann:

WHERE SLRRDEF_RDEF_CODE = :parm_dd_rdef.RDEF_CODE 
     OR (:parm_dd_rdef.RDEF_DESC = '-All-' 
      and SLRRDEF_RDEF_CODE 
       in ('A100','A110','B100','B110','B120','B130','W110','W590')) 

Wenn Sie wirklich über die nicht kümmern Wert von SLRRDEF_RDEF_CODE, wenn der Parameter ist es '-All-', dann noch einfacher ist:

where SLRRDEF_RDEF_CODE = :parm_dd_rdef.RDEF_CODE 
     OR :parm_dd_rdef.RDEF_DESC = '-All-' 
+0

im Wesentlichen ist dies eine Form, in der die Leute auswählen, was sie wollen wollen. Wenn es alles ist, sollte es alle damit verbundenen Codes auswählen, das ist die A100, B100, usw. Wenn nicht, sollte es nur den Code auswählen, die die SLRRDEF_RDEF_CODE = sein würde: parm_dd_rdef.RDEF_CODE –

+0

@ Taku_ nicht Allans letztes Bit erfüllt deine Bedürfnisse? – Twelfth

+0

Ja! Es tut und tatsächlich die Daten, die ich erhielt, wirft ein paar Fragen auf, die ich jemand fragen muss (da die Räume im Ziehen falsch scheinen!) Danke Ihnen danken –

Verwandte Themen