如何 return 来自 OracleDB 的非空列

How to return a non null column from OracleDB

我正在创建关于 eclipse 的 birt 报告,我需要放置一个日期过滤器。 我在报告中有超过 1 个带日期的字段,其中一些为空。 问题是:如何使用正确的日期(非空)作为过滤器的参数?我正在尝试做这样的事情:

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

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

您可以使用COALESCE功能。它 returns 给定列表中的第一个 "not NULL" 值。

会是这样的:

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

您是否要显示 D1、D2、D3、D4、D5 中的第一个非空列?如果是这样,你可能会更好 COALESCE(D1, D2, D3, D4, D5).

您的案例陈述不会像您预期的那样工作,因为

a) “==”在 Oracle 中不是有效语法

b) 比较 <something> = null(相应地,<something> != null)总是 returns null - 即。它既不是真的也不是假的。相反,您应该检查:<something> is null(反之:<something> is not null)。

c) 您的逻辑不完整 - 您正在检查如果 D1 到 D5 为空该怎么做,而不是如果 D1(或 D2 或...)不为空会发生什么。

假设您想要第一个非空值,这应该让您了解如何使用合并和案例逻辑来做到这一点:

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