2017-09-19 17 views
0

私のUCOカラムに数字1または2が表示されます。現在のところ、私のケースステートメントのためにNULLが表示されています。CASE文から他のすべての結果を返すにはどうすればいいですか

本当の人物を表示する方法はありますか?

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

他に追加する必要があります – Moudiz

答えて

3

CASEステートメントにELSE句を追加します。また、

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'; 

  1. 使用ANSI結合構文を(むしろ、従来よりも構文をカンマで参加)、それはそれを作るようテーブルの結合方法がはるかに分かりやすく、古い(+)構文のエラーを回避できます。
  2. '14-AUG-17'は日付リテラルではありません。文字列リテラルです。日付列と比較する場合、Oracleは暗黙的に日付リテラルに変換しようとしますが、これは書式マスクとしてNLS_DATE_FORMATセッション変数を使用して行われます。この値はユーザセッションごとにに設定され、に設定され、各ユーザはそれぞれの設定を変更できます。既定の設定に依存してユーザーがそれを変更すると、そのユーザー(および他のユーザー)のクエリが(クエリを変更せずに)中断され、デバッグが非常に困難になります。代わりにDATE '2017-08-14'のANSI日付リテラルを使用するか、書式マスクを明示的に記述します(言語固有の月名を使用する場合は言語も同様)TO_DATE('14-AUG-17', 'DD-MON-RR','NLS_LANGUAGE="ENGLISH"')
関連する問題