如何从OracleDB返回非空列

时间:2015-03-17 17:01:28

标签: sql oracle birt

我正在创建关于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

然后这将返回一个有效的日期,我会用作过滤器。但这似乎不起作用。有任何想法吗? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用COALESCE功能。它返回给定列表中的第一个“非NULL”值。

会是这样的:

COALESCE(D___1, D___2, D___3, D___4, D___5) as DATA

答案 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