Oracledb查询以下用例

时间:2018-02-26 10:11:01

标签: sql oracle query-performance

我有一个如下所示的可用性表

AVAIL_DATE | AVAILABLE

AVAIL_DATE代表逗留日期,AVAILABLE是一个字母,其中包含' T'或者' F'。

我需要检查可用性表是否适用于给定范围内的所有日期(START_DATE,END_DATE)

我知道我可以像下面的查询一样实现它

Operate to check whether it's all true 

    Select AVAILABLE from AVAILABILITY 
    where AVAIL_DATE BETWEEN (START_DATE, END_DATE); 

我无法弄清楚操作部分,而且我也不确定这个用例的最佳oracledb查询,因为我是PL / SQL的新手

有人可以帮我查询吗?

2 个答案:

答案 0 :(得分:2)

只计算T值的数量等于日期数:

SELECT CASE
       WHEN COUNT( CASE available WHEN 'T' THEN 1 END ) = COUNT(*)
       THEN 'All days available'
       ELSE 'Not available'
       END AS is_available
FROM   AVAILABILITY 
WHERE  DATE BETWEEN START_DATE AND END_DATE; 

答案 1 :(得分:-1)

在您方便的时候阅读以下内容,但这是您的真/假...

SELECT COUNT(*)
  FROM AVAILABLE
 WHERE AVAIL_DATE BETWEEN START_DATE AND END_DATE
   AND AVAILABLE = 'F'

如果返回计数大于0,则条件为FALSE

在您的方便之下阅读......有用 首先,PL / SQL是一个完整的语言,如C / Java / C ++ / C#,带有BULK COLLECT INTO子句(这里你可能需要)和其他几个部分......大大提前学习。是的,这可能听起来没有贡献,但批评",但继续阅读真实细节。

指定名称为DATE的列。由于DATE是OracleDB中的保留字,因此我建议将列名更改为AVAIL_DATE。

SQL for Oracle看起来像

SELECT AVAILABLE
  FROM AVAILABLE
 WHERE AVAIL_DATE BETWEEN START_DATE and END DATE

但是你可能会同时收到T和F,因为它们都会在日期范围内,这是PL / SQL中的CURSOR或者PL / SQL语句可以读作

SELECT AVAILABLE
  BULK COLLECT INTO collection_of_type_char_1
  FROM AVAILABLE
 WHERE AVAIL_DATE BETWEEN START_DATE and END DATE

在PL / SQL中学习集合(" collection_of_type_char_1"上面)是你自己只能做的事情。