Sql 查询以从单个查询中获取多个结果或返回null
我有一个带有以下字段的假日表Sql 查询以从单个查询中获取多个结果或返回null,sql,oracle11g,Sql,Oracle11g,我有一个带有以下字段的假日表 COLUMN_NAME DATA_TYPE ------------------------------- HOLIDAY_ID NUMBER(10,0) HOLIDAY_NAME VARCHAR2(150 BYTE) HOLIDAY_DATE TIMESTAMP(6) DAY_OF_WEEK VARCHAR2(20 BYTE) HOLIDAY_TYPE_ID NUMBER 样本
COLUMN_NAME DATA_TYPE
-------------------------------
HOLIDAY_ID NUMBER(10,0)
HOLIDAY_NAME VARCHAR2(150 BYTE)
HOLIDAY_DATE TIMESTAMP(6)
DAY_OF_WEEK VARCHAR2(20 BYTE)
HOLIDAY_TYPE_ID NUMBER
样本数据为
HOLIDAY_ID HOLIDAY_NAME HOLIDAY_DATE DAY_OF_WEEK HOLIDAY_TYPE_ID
-------------------------------------------------------------------------------
305 Republic Day 26-01-17 12:00:00.000000000 AM Thursday 1
306 Maha Shivratri 24-02-17 12:00:00.000000000 AM Friday 1
我已使用以下查询获取特定月份/年份的假日日期:
(查询)
如果结果为空(即月/年=2016年6月),则此操作正常,但当月份包含多个假日(即月/年=2016年10月)时,会出现“单行子查询返回多行”错误
如何编写一个查询,如果查询返回多行,则显示这些结果,否则为空结果显示“0”
(<强>注释< /强>:假日按印度日历]
< P> >您应该考虑将查询更改为:SELECT NVL(TO_CHAR(holiday_date,'DD/MM/YY'), '0') holiday
FROM admin_holiday
WHERE TO_CHAR(holiday_date,'MON-YYYY') = 'JUN-2016'
--WHERE TO_CHAR(holiday_date,'yyyymm') = '201606'
AND holiday_type_id = 1
AND TO_CHAR(holiday_date,'Day') NOT IN ('Sun', 'Sat');
您需要将nvl函数应用于列,以应用于结果,如下所示:
select nvl(to_char(holiday_date,'DD/MM/YY'),'0') holiday
from (select 1 as dummy from dual) d left join admin_holiday
on to_char(holiday_date,'DD-MON-YYYY') like '%-JUN-2016%'
and holiday_type_id=1 and to_char(holiday_date,'Day') not like 'Sun%'
and to_char(holiday_date,'Day') not like 'Sat%'
另一方面:学习如何写入,但如果表中没有数据,它将不会返回任何数据,但我至少需要一条记录。我尝试过一次,但如果它为null,则不会返回任何内容,而不是“0”@VikramSingh,当您说
null
,你是说admin\u holiday
在WHERE语句中没有记录吗?是的,这意味着admin\u holiday没有记录好了,用dual
试试这个技巧。我不确定它是否会工作,我还没有测试它。如果结果不为null,则该查询可以正常工作,但对于null结果不显示任何内容。否,这将导致错误为“FROM keyword not found where expected”,检查是否存在拼写错误。
select nvl(to_char(holiday_date,'DD/MM/YY'),'0') holiday
from (select 1 as dummy from dual) d left join admin_holiday
on to_char(holiday_date,'DD-MON-YYYY') like '%-JUN-2016%'
and holiday_type_id=1 and to_char(holiday_date,'Day') not like 'Sun%'
and to_char(holiday_date,'Day') not like 'Sat%'
SELECT NVL(TO_CHAR(holiday_date,'DD/MM/YY'), '0') holiday
FROM admin_holiday
WHERE TO_CHAR(holiday_date,'MON-YYYY') = 'JUN-2016'
--WHERE TO_CHAR(holiday_date,'yyyymm') = '201606'
AND holiday_type_id = 1
AND TO_CHAR(holiday_date,'Day') NOT IN ('Sun', 'Sat')
union all
select '0' from dual where not exists(SELECT NVL(TO_CHAR(holiday_date,'DD/MM/YY'), '0') holiday
FROM admin_holiday
WHERE TO_CHAR(holiday_date,'MON-YYYY') = 'JUN-2016'
--WHERE TO_CHAR(holiday_date,'yyyymm') = '201606'
AND holiday_type_id = 1
AND TO_CHAR(holiday_date,'Day') NOT IN ('Sun', 'Sat'))