我在 MYSQL 和显然其他数据库引擎中发现有一个“最大”的函数,可以像这样使用:最大(1、2、3、4),它会返回 4。我需要这个,但我使用的是 IBM 的 DB2 . 有没有人知道这样的等效函数,即使它只接受 2 个参数?
我在某个地方发现了 MAX 应该这样做,但它不起作用......它只适用于选择列的 MAX。
如果没有这样的功能,是否有人知道执行此操作的存储过程是什么样的?(我没有存储过程的经验,所以我不知道 DB2 能做什么)。
为什么 MAX 不适合您?
从 sysibm.sysdummy1 中选择 max(1,2,8,3,1,7)
给我
1
---------------
8
1 record(s) selected.
正如 Dave 指出的那样,MAX 应该可以工作,因为它既作为标量函数又作为列函数重载(标量需要 2 个或更多参数)。在 DB2 for LUW、DB2 for z/OS 和 DB2 for i5/OS 中就是这种情况。您使用的 DB2 的确切版本和平台是什么?您使用的确切语句是什么?MAX 标量版本的要求之一是所有参数都是“兼容的”——我怀疑您传递给函数的一个或多个参数可能存在细微的类型差异。
在 Linux V9.1 上,“select max (1,2,3) ...”给出 -
SQL0440N 未找到类型为“FUNCTION”的名为“MAX”且具有兼容参数的授权例程。SQLSTATE=42884
它是一个标量函数,需要单个值或单个列名。在 z/os 上,它的行为不同。
但是,它确实在 Linux 9.5 上按预期工作。
两种选择:
如何按降序对列进行排序并抓住前 1 行?
根据我的“SQL 袖珍指南”,MAX(x) 返回一组中的最大值。
更新:如果您正在查看列,显然#1 将不起作用。
这听起来很疯狂,但在 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 函数用于字符输入,你必须给它另一个名字。
请检查以下查询:
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