2017-05-08 85 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