我有一个 SQL 查询,其中我将 sysdate 传递给查询问题是,当表中没有与 sysdate 匹配的日期时,即使此处应用了 nvl,它也不显示零是我的查询
select * from molasses
where trunc(trn_dte) = trunc(sysdate)
但它仅在表中存在当前日期时显示数据,但如果在表中找不到数据,我想显示零。请帮助我在 oracle 10 g 中执行此操作。因为有时情况就像上面一样,当没有找到数据时我必须显示零
像这样的东西会起作用,但我认为这不是一个好主意:
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
这是一个非常不寻常的问题。当没有数据存在时,为什么查询应该返回 0?通常由客户端软件/报告生成器在没有数据时显示有意义的内容,而不是查询本身。
这很奇怪,我不会使用它,它更像是一个 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()
功能也可以轻松解决该问题。
假设您的表有四个数字列,您可以编写:
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