我正在创建关于eclipse的birt报告,我需要设置一个日期过滤器。 我在报告中有多个带日期的字段,其中一些是空的。 问题是:如何使用正确的日期(非空)作为过滤器的参数?我试图做这样的事情:
select
case
when D___1 is null then
D___2
when D___2 is null then
D___3
when D___3 is null then
D___4
when D___4 is null then
D___5
end as data
然后这将返回一个有效的日期,我会用作过滤器。但这似乎不起作用。有任何想法吗? 提前谢谢。
答案 0 :(得分:2)
答案 1 :(得分:1)
您是否尝试显示D1,D2,D3,D4,D5中的第一个非空列?如果是这样,那么COALESCE(D1, D2, D3, D4, D5)
可能会更好。
您的案例陈述无法按预期运作,因为
a)“==”在Oracle
中是无效的语法 b)比较<something> = null
(相应地,<something> != null
)总是返回null - 即。它既不是真也不是假。相反,您应该检查:<something> is null
(反之:<something> is not null
)。
c)你的逻辑是不完整的 - 如果D1到D5为空,你要检查该怎么做,但是如果D1(或D2或......)不为空则不会发生什么。
假设您想要第一个非空值,这应该让您了解如何使用coalesce和case逻辑来实现它:
with sample_data as (select 1 col1, null col2, null col3 from dual union all
select null col1, 2 col2, null col3 from dual union all
select null col1, null col2, 3 col3 from dual union all
select null col1, 4 col2, 5 col3 from dual union all
select 6 col1, 7 col2, 8 col3 from dual union all
select 9 col1, null col2, 10 col3 from dual)
select col1,
col2,
col3,
coalesce(col1, col2, col3) first_non_null_coalesce,
case when col1 is not null then col1
when col2 is not null then col2
when col3 is not null then col3
end first_non_null_case_logic
from sample_data;
COL1 COL2 COL3 FIRST_NON_NULL_COALESCE FIRST_NON_NULL_CASE_LOGIC
---------- ---------- ---------- ----------------------- -------------------------
1 1 1
2 2 2
3 3 3
4 5 4 4
6 7 8 6 6
9 10 9 9