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