可以帮助我编写SQL查询,该查询应该根据以下条件执行Oracle Min函数。
对于列值的EG
- 0,0,0,0然后输出应为0
- 0,null,0,null然后输出应为o
- 0,2,4,5,6然后输出应为2(请注意,我们在此处排除零(
- 0,2,null,4,5然后输出应为2(在这里我们不包括零(
- null,null,null,null,然后输出应为null。
我已经写了查询,该查询满足了上述所有情况,但是对于所有列值为null的最后情况都将失败。而不是返回null,它将返回0。某些人还可以修改以下查询以适合最后情况吗?
选择nvl(nullif(columnName,0((,0(来自tablename;
还请记住,当我们使用HSQL DB进行运行Junits时,查询应在Oracle以及HSQLDB中运行。
如果您的查询满足所有4个情况,则只有一个情况将解决您的问题。
SELECT CASE WHEN MIN(COLUMNNAME) IS NULL THEN NULL ELSE NVL(MIN(NULLIF(COLUMNNAME,0)),0) END FROM TABLENAME;
注意: - 假设除了第5次以外的查询所满足的所有情况。
我将在下面显示带有两个列ID
和VAL
的输入表,以说明各种可能性。您需要每个ID
(甚至整个表(一个结果,因此这必须是GROUP BY
和某些聚合功能的工作。您想区分三种类型的值:大于零,零和null(按此顺序(;您想选择每个ID
(以此优先级的顺序(存在的"最高优先级组",仅对于该优先级组,您想选择最小值。这是恰好汇总FIRST/LAST
函数的作用。要按三个"类"值订购,我们在汇总LAST
函数的ORDER BY
子句中使用CASE
表达式。
以下WITH
子句不是解决方案的一部分 - 我仅包括它来创建测试数据(在您的现实生活中,使用您的实际表和列名称并删除整个WITH
子句(。
with
inputs ( id, val ) as (
select 1, 0 from dual union all
select 1, 0 from dual union all
select 1, 0 from dual union all
select 2, 0 from dual union all
select 2, null from dual union all
select 2, 0 from dual union all
select 3, 0 from dual union all
select 3, 2 from dual union all
select 3, 5 from dual union all
select 4, 0 from dual union all
select 4, 3 from dual union all
select 4, null from dual union all
select 5, null from dual union all
select 5, null from dual
)
select id,
min(val) keep (dense_rank last order by case when val > 0 then 2
when val = 0 then 1
else 0
end
) as min_val
from inputs
group by id
order by id
;
ID MIN_VAL
---------- ----------
1 0
2 0
3 2
4 3
5