简体   繁体   English

查询以从单个查询获取多个结果或返回null

[英]Query to get multiple results from single query or return null

I have a Holiday table with following fields 我有一个假期表,其中包含以下字段

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

and the sample data is 样本数据是

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

I have used the following query to get the holiday_date of a particular month/year: (QUERY) 我使用以下查询获取特定月份/年份的holiday_date: (QUERY)

select nvl((select to_char(holiday_date,'DD/MM/YY') holiday 
from admin_holiday where 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%'),'0') holiday from dual

This works fine if the result is null(ie for month/year= JUN/2016) but gives "single-row subquery returns more than one row" error when the month contains more than one holiday (ie for month/year= OCT/2016) 如果结果为空(即,月/年= JUN / 2016),但工作正常,但当月份包含多个假期(例如,月/年= OCT /)时,出现“单行子查询返回多个行”错误2016)

How do I write a query such that if the query returns multiple rows then display those results else display '0' for NULL result? 如何编写查询,以便如果查询返回多行然后显示那些结果,否则显示NULL结果为'0'?

[ NOTE : The holidays are as per the Indian calendar] [ 注意 :假期按照印度日历]

You should consider changing your query to this: 您应该考虑将查询更改为此:

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

You need to apply the nvl function to the column, to to the result, like this: 您需要将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%'

On a side note: learn how to write sargable queries 附带说明:了解如何编写可查询的查询

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM