2017-09-19 2 views
0

Ich möchte, dass meine UCO-Spalte entweder eine Zahl 1 oder 2 zeigt, alles andere, was ich die tatsächliche Zahl zurückgeben möchte, könnte dies eine beliebige Zahl sein. Zur Zeit zeigt es jedoch und NULL wegen meiner Case-Anweisung.Wie gebe ich alle anderen Ergebnisse von einer CASE-Anweisung zurück

Irgendwelche Ideen, wie man die wahre Zahl zeigt?

SELECT S.STOPP_REAL_DELIVERY AS "Delivery Date", 
    case when C.COLLECT_COLLECTED_QTY = '-1' THEN '1' 
    when C.COLLECT_COLLECTED_QTY = '-2' THEN '2' END AS UCO 
FROM MBR_COLLECT C, 
    MBR_STOPP S, 
    MBR_JOURNEY J 
WHERE C.MARKET_CODE   = 'UK' 
AND C.COLLECT_TYPE_CODE  = 4 
AND C.STOPP_ID    = S.STOPP_ID 
AND J.JOURNEY_ID    = S.JOURNEY_ID 
AND J.JOURNEY_PLANNED_START >= '14-AUG-17'; 
+0

sollten Sie sonst hinzufügen – Moudiz

Antwort

3

schreiben ELSE Klausel zum CASE Aussage:

SELECT S.STOPP_REAL_DELIVERY AS "Delivery Date", 
     CASE 
     WHEN C.COLLECT_COLLECTED_QTY = '-1' THEN '1' 
     WHEN C.COLLECT_COLLECTED_QTY = '-2' THEN '2' 
     ELSE C.COLLECT_COLLECTED_QTY 
     END AS UCO 
FROM MBR_COLLECT C 
     INNER JOIN MBR_STOPP S 
     ON (C.STOPP_ID = S.STOPP_ID) 
     INNER JOIN MBR_JOURNEY J 
     ON (J.JOURNEY_ID = S.JOURNEY_ID) 
WHERE C.MARKET_CODE   = 'UK' 
AND C.COLLECT_TYPE_CODE  = 4 
AND J.JOURNEY_PLANNED_START >= DATE '2017-08-14'; 

auch:

  1. Verwenden Sie die ANSI-Join-Syntax (statt der Legacy-Komma-Join-Syntax), wie sie es macht viel einfacher zu sehen, wie die Tabellen verbunden sind und vermeidet Fehler von der alten (+) Syntax.
  2. '14-AUG-17' ist kein Date-Literal - es ist ein String-Literal. Oracle versucht, es implizit in ein Datumsliteral zu konvertieren, wenn Sie es mit einer Datumsspalte vergleichen. Dies wird jedoch mit der Sitzungsvariablen NLS_DATE_FORMAT als Formatmaske durchgeführt. Dieser Wert wird pro Benutzersitzung festgelegt und jeder Benutzer kann ihre eigenen Einstellungen ändern. Wenn Sie sich auf eine Standardeinstellung verlassen und der Benutzer sie ändert, wird Ihre Abfrage für diesen Benutzer (und keine anderen) unterbrochen (ohne die Abfrage geändert zu haben) und es wird sehr schwierig sein, zu debuggen. Verwenden Sie stattdessen ein ANSI-Datumsliteral DATE '2017-08-14' oder geben Sie explizit die Formatmaske an (und wenn Sie sprachspezifische Monatsnamen verwenden, dann auch die Sprache) TO_DATE('14-AUG-17', 'DD-MON-RR','NLS_LANGUAGE="ENGLISH"').
Verwandte Themen