如何从CASE语句返回所有其他结果

时间:2017-09-19 10:13:01

标签: oracle case oracle-sqldeveloper case-statement

我希望我的UCO列显示数字1或2,其他任何我想要返回的实际数字,这可能是任何数字。但是由于我的case语句,它目前显示为NULL。

任何想法如何展示真实的人物?

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

1 个答案:

答案 0 :(得分:3)

ELSE语句中添加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'
       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会话变量作为格式掩码来完成;此值设置为每用户会话,每个用户都可以更改自己的设置。如果您依赖于默认设置并且用户更改了它,那么您的查询将会中断(没有更改查询)该用户(并且没有其他人),并且调试将非常困难。使用ANSI日期文字而不是DATE '2017-08-14'或明确说明格式掩码(如果您使用的是特定于语言的月份名称,则使用语言)TO_DATE( '14-AUG-17', 'DD-MON-RR','NLS_LANGUAGE="ENGLISH"' )