【问题标题】:Is there a 'greatest' function in db2?db2 中是否有“最强大”的功能?
【发布时间】:2008-10-24 18:54:02
【问题描述】:

我在 MYSQL 和其他数据库引擎中发现有一个“最大”的函数可以像这样使用:最大(1、2、3、4),它会返回 4。我需要这个,但我是使用 IBM 的 DB2。有没有人知道这样的等效函数,即使它只接受 2 个参数?

我在某个地方发现了 MAX 应该这样做,但它不起作用......它只适用于选择列的 MAX。

如果没有这样的功能,有人知道执行此操作的存储过程是什么样的吗? (我没有存储过程的经验,所以我不知道 DB2 能做什么)。

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    为什么 MAX 不适合你?

    从 sysibm.sysdummy1 中选择 max(1,2,8,3,1,7)

    给我

        1
        ---------------
                     8
    
          1 record(s) selected.
    

    【讨论】:

    • 那么 db2 中的 max 是标量和聚合的吗?有趣。
    • 奇怪...我得到“SQL0440N 没有找到具有兼容参数的类型为“FUNCTION”的名为“MAX”的授权例程。当我这样做时,SQLSTATE=42884....
    【解决方案2】:

    正如 Dave 指出的那样,MAX 应该可以工作,因为它既作为标量函数又作为列函数重载(标量需要 2 个或更多参数)。在 DB2 for LUW、DB2 for z/OS 和 DB2 for i5/OS 中就是这种情况。您使用的 DB2 的确切版本和平台是什么,您使用的确切语句是什么? MAX 标量版本的要求之一是所有参数都是“兼容的”——我怀疑您传递给函数的一个或多个参数可能存在细微的类型差异。

    【讨论】:

      【解决方案3】:

      在 Linux V9.1 上,“select max (1,2,3) ...”给出 -

      SQL0440N 没有名为“MAX”的“FUNCTION”类型的授权例程具有 找到了兼容的参数。 SQLSTATE=42884

      它是一个标量函数,需要单个值或单个列名。在 z/os 上,它的行为不同。

      但是,它在 Linux 9.5 上确实可以正常工作。

      【讨论】:

        【解决方案4】:

        两种选择:

        1. 如何对列进行降序排序并抓住前 1 行?

        2. 根据我的“SQL 袖珍指南”,MAX(x) 返回集合中的最大值。

        更新:如果您正在查看列,显然 #1 将不起作用。

        【讨论】:

        • 我们需要一个标量函数,而不是列函数...我们有 6 个不同的列要查找最大值,而不是一列值
        • 您没有在原始请求中指定。
        • 我认为它暗示了“可以使用的函数,如:最大(1,2,3,4),它会返回 4”和“它只适用于选择一个列。”
        【解决方案5】:

        这听起来很疯狂,但在 DB2 中不存在这样的功能,至少在 9.1 版本中不存在。如果要选择两列中较大的一个,最好使用 case 表达式。

        您还可以定义自己的 max 函数。例如:

        create function importgenius.max2(x double, y double)
        returns double
        language sql
        contains sql
        deterministic
        no external action
        begin atomic
            if y is null or x >= y then return x;
            else return y;
            end if;
        end
        

        将输入和输出定义为双精度可以利用类型提升,因此该函数也适用于整数。 “确定性”和“无外部操作”语句有助于数据库引擎优化函数的使用。

        如果你想让另一个 max 函数用于字符输入,你必须给它另一个名字。

        【讨论】:

          【解决方案6】:

          请检查以下查询:

          select * from table1 a,
          (select appno as sub_appno,max(sno) as sub_maxsno from table1 group by appno) as tab2
          where a.appno =tab2.sub_appno and a.sno=tab2.sub_maxsno
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-06-26
            • 2011-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-08
            • 1970-01-01
            相关资源
            最近更新 更多