条件选择语句
问题描述:
我有两个表名为秩序和公众假期如下:条件选择语句
顺序表:
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
我希望看到通过把一列
如果订单日期是基于公众假期表或不是公众假期是否有可能做这个?
答
您可以使用外部联接是这样的:
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
,因此您需要编辑我的代码以匹配您的表名。
答
改变的顺序表名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;
答
两件事情来remeber:
- ORDER是一个关键字,那么请使用另一个表名
- 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'是完全有效的指示列别名 – APC
因此到Oracle SQL参考CASE语句应该以END结束,不是结束,因为(虽然你是对的 - 它的工作原理):[CASE语句参考](http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm) – m3rgus
'CASE'子句以'END'结尾。 “AS”语法是列别名的可选指示符。因此'orderId as order_no'是'orderId orderno'的替代方法。不知道你为什么认为这很重要。 – APC