Sql oracle案例还是解码?-如何处理无记录

Sql oracle案例还是解码?-如何处理无记录,sql,oracle,case,decode,Sql,Oracle,Case,Decode,在这个case语句中,我如何确保如果我现在选择了行,那么我将我的结果设置为1? 如果我没有记录或计数为0,则我希望值为1。我还希望默认情况下,空日期为sysdate 这是我到目前为止所拥有的。它适用于sysdate-1,但当我使用sysdate-0或=sysdate今天的日期测试它时,我发现 没有记录。所以我也希望能够处理空值 如何更改此查询以执行此操作?或者我会使用类似解码的东西 select to_date(year||'/'||month||'/'||day, 'YYYY/MM

在这个case语句中,我如何确保如果我现在选择了行,那么我将我的结果设置为1? 如果我没有记录或计数为0,则我希望值为1。我还希望默认情况下,空日期为sysdate

这是我到目前为止所拥有的。它适用于sysdate-1,但当我使用sysdate-0或=sysdate今天的日期测试它时,我发现 没有记录。所以我也希望能够处理空值

如何更改此查询以执行此操作?或者我会使用类似解码的东西

select 
     to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') as mydt,
     case when count(*) = 0 then 1 else 0 end result
from Table1 
where 
   to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') >= trunc(sysdate)-1
GROUP BY 
    to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD')
这是我的表格说明。也许,我应该去掉时间戳? 还有一个计数值可能有助于更改此查询。所以我要找的就要来了 如果可能的话,使用带有时间戳的值1或0

SQL> desc Table1
 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 YEAR                           NUMBER
 QUARTER                        NUMBER
 MONTH                          NUMBER
 DAY                            NUMBER
 HOUR                           NUMBER
 TIMESTAMP                      NUMBER
 CNT_N                              NUMBER
 ACTN_N                             NUMBER 
 ADDR_C                       VARCHAR2(255)

使用group by时,您永远不会得到零计数。如果没有行,则不会得到任何组,如果有行,则得到的任何组都将显示行数

如果1月1日有3行,1月3日有3行,您将获得:

2011/01/01 3
2011/01/03 3

1月2日你不会吵架。是否要生成该行?您希望返回的行数是否达到最大值?

我认为您可以像下面这样修改查询,将sysdate指定为空值

select
       nvl(to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') ,sysdate) as mydt
from Table1  
where
       nvl(to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') ,sysdate) 
                      >= trunc(sysdate)-1 
GROUP BY      nvl(to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') ,sysdate)
但是你的第二个要求不是很清楚。。。。请澄清您对count的具体要求*

如果要为空日期计数指定1,则可以在select STANTT中添加以下行

case 
when nvl(to_date(year||'/'||month||'/'||day, 'YYYY/MM/DD') ,sysdate) = sysdate then
     1
else
count(*)-- or 0 ???!!!!!

看起来您需要生成日期,然后查看记录如何匹配每个日期。假设您将来没有任何数据,您可以执行以下操作:

select trunc(sysdate) + level - (:range + 1) as dt
from dual
connect by level <= (:range + 1);
然后,您可以将外部连接到该日期列表:

with tmp_dt as (
    select trunc(sysdate) + level - (:range + 1) as dt
    from dual
    connect by level <= (:range + 1)
)
select td.dt as mydt,
    case when count(t.year) = 0 then 1 else 0 end as result
from tmp_dt td
left join table1 t on t.year = extract(year from td.dt)
    and t.month = extract(month from td.dt)
    and t.day = extract(day from td.dt)
group by td.dt
order by td.dt;

如果您将来确实有数据,则不会显示它;范围是看过去的天数。如果您知道有一个限制,比如七天,您可以使用级别连接,那么您可以将整个查询封装在NVL函数中 像这样

我已从查询中删除case语句 相反,这个查询将做的是,如果您的查询返回任何值,它将在不受干扰的情况下执行。但是,如果查询没有返回任何内容,那么NVL函数将接管并返回1 我使用了TO_CHAR函数来维护NVL函数中两个参数的数据类型。返回的日期和NVL的值都是基于字符的


希望有帮助

你为什么需要它?空结果集很好地表明没有行。如果没有行,您希望mydt是什么?我有一个程序需要查找1或0。所以我想将空结果设置为值1.mydt,使其仅为sysdate或current date。。。只是你需要知道/分析你的问题…我添加了我的表的描述。有一个timestamp字段,看起来像一个带有计数的列。因此,基本上,我需要知道表中是否有我传入的任何日期的数据,并将默认值设置为1或0。为什么时间戳字段是数字,而不是实际的时间戳?这可能并不比使用年/月/日更好,但取决于它包含什么,以及您有什么索引。我仍然不清楚-你是在传递一个日期并想要一个单一的结果值,还是一个开始日期并想要之后每个日期的结果?如果是后者,将来会有数据吗?是的,不确定为什么会这样构造,这就是为什么我选择了其他与日期相关的列。至于传递一个日期。我想要一个结果值,一行。yes data exists=0,no data not exists=1,并且使用该结果有一个日期值,即使今天没有值,那么result=1并给我今天的日期。@cjd143SD-我编辑了答案,使其具有一个版本,其中它只查找今天的数据,并返回一个值,无论是否找到该值。我想,你最初查询中的>=让我很困惑……谢谢你的帮助。我也在对这些数据进行更好的分析。
with tmp_dt as (
    select trunc(sysdate) + level - (:range + 1) as dt
    from dual
    connect by level <= (:range + 1)
)
select td.dt as mydt,
    case when count(t.year) = 0 then 1 else 0 end as result
from tmp_dt td
left join table1 t on t.year = extract(year from td.dt)
    and t.month = extract(month from td.dt)
    and t.day = extract(day from td.dt)
group by td.dt
order by td.dt;
MYDT          RESULT
--------- ----------
19-JUL-11          0
20-JUL-11          1
with tmp_dt as (select trunc(sysdate) as dt from dual)
select td.dt as mydt,
     case when count(t.year) = 0 then 1 else 0 end result
from tmp_dt td
left join table1 t on t.year = extract(year from td.dt)
    and t.month = extract(month from td.dt)
    and t.day = extract(day from td.dt)
group by td.dt;

SELECT NVL(TO_CHAR((select to_date(year || '/' || month || '/' || day,
                                  'YYYY/MM/DD') as mydt
                     from Table1
                    where to_date(year || '/' || month || '/' || day,
                                  'YYYY/MM/DD') >= trunc(sysdate) - 1
                    GROUP BY to_date(year || '/' || month || '/' || day,
                                     'YYYY/MM/DD')),
                   'DD/MM/YYYY HH:MI:SS AM'),
           '1')
  FROM DUAL