0

我有一个 SQL 查询,其中我将 sysdate 传递给查询问题是,当表中没有与 sysdate 匹配的日期时,即使此处应用了 nvl,它也不显示零是我的查询

select * from molasses
where trunc(trn_dte) = trunc(sysdate)

但它仅在表中存在当前日期时显示数据,但如果在表中找不到数据,我想显示零。请帮助我在 oracle 10 g 中执行此操作。因为有时情况就像上面一样,当没有找到数据时我必须显示零

4

4 回答 4

2

像这样的东西起作用,但我认为这不是一个好主意:

select nvl(t.a, n.a) as a, nvl(t.b, n.b) as b, ...
from molasses t
right outer join (select 0 as a, 0 as b, ... from dual) n on 1 = 1
于 2012-09-24T09:39:56.563 回答
1

这是一个非常不寻常的问题。当没有数据存在时,为什么查询应该返回 0?通常由客户端软件/报告生成器在没有数据时显示有意义的内容,而不是查询本身。

于 2012-09-24T09:49:52.023 回答
1

这很奇怪,我不会使用它,它更像是一个 hack:

SELECT col1, col2, ..., colN              --- numeric columns
FROM molasses
WHERE trunc(trn_dte) = trunc(sysdate)

UNION ALL

SELECT 0, 0, ..., 0
FROM dual
WHERE NOT EXISTS
      ( SELECT *
        FROM molasses
         WHERE trunc(trn_dte) = trunc(sysdate)
      ) ;

人们只是想知道当表中只有一行并且所有值都为零时,应用程序/用户会理解什么。


我认为这也可以:

SELECT m.col1, m.col2, ..., m.colN              --- numeric columns
FROM dual LEFT JOIN molasses m
  ON trunc(m.trn_dte) = trunc(sysdate) ;

并显示 Nulls 而不是(想要的)0s。使用该COALESCE()功能也可以轻松解决该问题。

于 2012-09-24T09:41:46.437 回答
0

假设您的表有四个数字列,您可以编写:

select * from molasses
where trunc(trn_dte) = trunc(sysdate)
union all
select 0, 0, 0, 0 from dual
where ( select count(*) from molasses where trunc(trn_dte) = trunc(sysdate) ) = 0
于 2012-09-24T09:42:03.427 回答