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'))