【问题标题】:conditional select statement in oracleoracle中的条件选择语句
【发布时间】:2017-05-08 22:54:41
【问题描述】:

我有两张表,分别称为订单和公共假期:

订单表:

OrderId      OrderDate
---------------------------
    1        10 Mar 2017
    2        12 Mar 2017
    3        30 Mar 2017

公众假期表:

HoliId |     HolidayDate
---------------------------
    1        10 Mar 2017
    1        16 Mar 2017
    1        17 Mar 2017

我想像下面的伪代码那样做 SQL

SELECT OrderId, OrderDate, 
if OrderDate is in Holiday Table, 
  then "public holiday" 
  else to_char(to_date(DAY, 'dd/mm/yy'), 'OrderDate')
from Order

所以我想要的结果如下

OrderId      OrderDate       DAY
-----------------------------------------
    1        10 Mar 2017     Public holiday
    2        12 Mar 2017     Monday
    3        30 Mar 2017     Friday

我想通过放一列来查看订单日期是否是基于公共假期表的公共假期

可以这样做吗?

【问题讨论】:

    标签: sql oracle optimization


    【解决方案1】:

    您可以像这样使用外连接:

    SELECT OrderId,
           OrderDate, 
           case when holidaydate is not null then  'Public holiday' 
                 else to_char(OrderDate, 'Day') end as DAY
    from orders
         left outer join holidays
            on OrderDate = holiday_date ;
    

    如果日期匹配 holidaydate 不为空,则 CASE 子句将显示您想要的字符串,否则将显示 orderdate 的日期。


    order 是保留字。大概您的真实表具有不同的名称,以避免ora-00903 错误。我在示例中使用了orders,因此您需要编辑我的代码以匹配您的表名。

    【讨论】:

      【解决方案2】:

      将 order 的表名更改为 ordero,因为 order 是关键字

       select ordero.orderid, ordero.orderdate, holiday.holidaydate,case when holiday.holidaydate is not null then 'Public Holiday'
       else to_char(ordero.orderdate,'Day') end "Day" 
       from ordero left outer join holiday on ordero.orderdate=holiday.holidaydate;
      

      【讨论】:

        【解决方案3】:

        要记住两件事:

        1. ORDER 是关键字,所以请使用其他表名
        2. CASE 语句应该以 END 而不是 END AS 结束

        可能的解决方案:

        SELECT O.OrderId,
          O.OrderDate,
          CASE
            WHEN H.HolidayDate IS NOT NULL
            THEN 'Public holiday'
            ELSE TO_CHAR(O.OrderDate, 'Day')
          END DAY
        FROM ORDER_TABLE O
        LEFT JOIN HOLIDAY_TABLE H
        ON H.HolidayDate=O.OrderDate;
        

        【讨论】:

        • AS 表示列别名是完全有效的
        • 根据 Oracle SQL Reference CASE 语句应该以 END 结束,而不是 END AS (虽然你是对的 - 它有效):CASE statement reference
        • CASE 子句以END 结尾。 AS 语法是列别名的可选指示符。所以orderId as order_noorderId orderno 的有效替代品。不知道为什么你认为这很重要。
        猜你喜欢
        • 1970-01-01
        • 2013-10-04
        • 2015-01-28
        • 2013-03-14
        • 2014-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多