Select子句中的Oracle SQL Min



可以帮助我编写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次以外的查询所满足的所有情况。

我将在下面显示带有两个列IDVAL的输入表,以说明各种可能性。您需要每个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           

最新更新