2017-01-30 5 views
-1

Ich habe eine verschachtelte DECODE-Anweisung, die ich versuche, von Oracle auf SQL Server umzuschreiben und es gibt mir passt. Kann mir jemand bitte helfen, diese Linie zu umschreiben:DECODE Erklärung zu SQL

DECODE(UR.UR_REG_IND, 'P', 'P', 'Y') = DECODE(:UR_REG_IND, 'B', DECODE(UR.UR_REG_IND, 'P', 'P', 'Y'), :UR_REG_IND) 

ich die :UR_REG_IND verstehen ist eine Eingangsgröße @UR_REG_IND und ich verstehe auch die DECODE eine Art von CASE in SQL, aber ich bin alle Arten von Schwierigkeiten, versuchen, umschreiben Sie dies ohne eine verschachtelte CASE Anweisung, wenn es sogar möglich ist.

+0

'DECODE' ist eine Funktion, aber in Ihrem Beispiel scheinen Sie zuzuweisen, was ich glaube, dass es falsch ist (obwohl ich kein PL/SQL-Benutzer bin, weiß ich also nicht sicher). – Dai

+0

Was ist * die Absicht * des Codes? Ich versuche zu folgen, was passieren soll, aber es sieht so aus, als wäre die Logik "gebe P zurück, wenn der Wert" P "ist, sonst gebe den Wert zurück" - was nutzloser Code ist. – Dai

+0

Es sieht so aus, als hätten Sie hier einen verschachtelten DECODE. Warum versuchen Sie also verschachtelte Case-Ausdrücke zu vermeiden? Vielleicht, wenn Sie verbalisieren könnten, was Sie mit dem Code machen wollen, können wir Ihnen helfen, einen guten Ansatz dafür in t-sql zu finden. –

Antwort

0

Etwas in diese Richtung. Die Klammern werden nicht benötigt, aber sie können die Lesbarkeit verbessern.

case ur.ur_reg_ind when 'P' then 'P' else 'Y' end = 
case :ur_reg_ind when 'B' then (case ur.ur.reg_ind when 'P' then 'P' else 'Y' end) 
        else  :ur_reg_ind end 

Beachten Sie, dass diese Übersetzung in Oracle selbst funktionieren sollte - es ist tatsächlich, wie ich diese Bedingung schreiben würde. Es ist vielleicht länger, aber für mich scheint es viel einfacher zu lesen und zu verstehen (und deshalb zu erhalten).

+0

Ich habe das in meine größere Abfrage kopiert und es gibt mir Syntaxfehler mit dem innersten Fall ... Erwartet '(', oder SELECT, und das = Zeichen im ersten Fall nach dem Ende ... Falsche Syntax nach '='. Das ist das gleiche Problem, das ich versuchte, es selbst zu verschachteln. Hier ist, was ich oben und darunter habe: UP.UP_EFF_DATE ZWISCHEN: FROM_DATE UND : THRU_DATE UND \t \t \t UR.UR_REG_IND = \t \t \t \t \t \t \t \t Fall ur.ur_reg_ind \t \t \t \t \t wenn 'p' dann end 'P' else 'Y' = \t \t \t \t \t \t Fall: ur_reg_ind wenn 'B' dann ist (Fall ur.ur.reg_ind wenn 'p' 'P' else 'Y' dann Ende) anderes: ur_reg_ind Ende \t \t \t UP.UW_CODE <> 1000 uND – Levi

+0

@Levi - das macht keinen Sinn und es würde entweder mit CASE oder DECODE in Oracle entweder nicht funktioniert, weil Sie den Zustand 'und UR.UR_REG_IND haben = = '. Sie können nicht zwei Vergleiche hintereinander in einer Bedingung in einem SQL-Flavor haben. Was meinst du wirklich ** dort - brauchst du alle drei "Dinge", um gleich zu sein? – mathguy

+0

Wieder bitte, sei geduldig mit mir, ich habe es weder geschrieben noch habe ich es bearbeitet. Es ergibt auch keinen Sinn für mich, daher bin ich hier. Dies ist der ursprüngliche Code ... UND UP.UP_EFF_DATE ZWISCHEN: FROM_DATE UND: THRU_DATE ' ' UND DECODE (UR.UR_REG_IND, '# 39'P' # 39 ',' # 39'P '# 39', ' # 39'Y '# 39') = DECODE (: UR_REG_IND '+ ', '# 39'B' # 39 ', DECODE (UR.UR_REG_IND, '# 39'P' # 39 ',' # 39'P '# 39', '# 39'Y' # 39 '),: UR_REG_IND)' 'UND UP.UW_CODE <> 1000' – Levi