2017-05-08 96 views
1

我有两个表名为秩序和公众假期如下:条件选择语句

顺序表:

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 

我希望看到通过把一列

如果订单日期是基于公众假期表或不是公众假期是否有可能做这个?

回答

2

您可以使用外部联接是这样的:

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,因此您需要编辑我的代码以匹配您的表名。

0

改变的顺序表名ordero的顺序是一个关键字

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

两件事情来remeber:

  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; 
+0

'AS'是完全有效的指示列别名 – APC

+0

因此到Oracle SQL参考CASE语句应该以END结束,不是结束,因为(虽然你是对的 - 它的工作原理):[CASE语句参考](http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm) – m3rgus

+0

'CASE'子句以'END'结尾。 “AS”语法是列别名的可选指示符。因此'orderId as order_no'是'orderId orderno'的替代方法。不知道你为什么认为这很重要。 – APC