【发布时间】:2011-12-28 13:06:51
【问题描述】:
在 Oracle 和 MySQL 中,我如何创建一个接受不定数量参数的函数,以便可以像 GREATEST(value1,value2,...) 一样调用它?
按照某个标准比较两个值非常容易,但是将“更大”的值传递给另一个比较是我在 SQL 中似乎没有得到的工作。
谢谢!
编辑(在迈克下面的评论之后): 我正在寻找一种比较多列的解决方案。具体来说,我的问题是如何将 GREATEST() 实现为 UDF。下面的代码比较了三列。
SELECT CASE WHEN CASE WHEN col_1 < col_2 THEN col_2
ELSE col_1 END < col_3 THEN col_3
ELSE CASE WHEN col_1 < col_2 THEN col_2
ELSE col_1 END END AS greatest
FROM figures;
显然,这并不能很好地扩展。如果有一个通用函数将相同的比较方法一遍又一遍地应用于值列表,那将更加有用。
我所说的 SQL 是指任何 SQL 数据库产品,但我更喜欢适用于 Oracle 或 MySQL 的解决方案
【问题讨论】:
-
这和-select * from, order by x desc/asc 一样吗 最大值必须是第一个/最后一个?即使在 XSLt 中,我也只是对事物进行排序以获得最大值?
-
大概你的意思是 SQL Server - SQL(没有进一步限定)是指一种语言,由各种不同的产品在不同程度上实现,并且每个产品都有自己独特的扩展。
-
这是一种可以更好地扩展
case语句的方法。 stackoverflow.com/questions/7995945/… -
您要比较多少列?如果数量不多,可以使用
SELECT Max(Col4, Max(Col3, MAX(Col1, Col2))) FROM myTable。 -
很遗憾,IN 不能与比较运算符一起使用,而 ALL 和 ANY 不能与表达式/列列表一起使用。 MAX/MIN 函数也不能跨列工作。但这是个好主意。像下面这样嵌套一个 GREATER(或 LESSER)函数怎么样?
DELIMITER // CREATE FUNCTION greater(i1 int, i2 int) RETURNS int BEGIN DECLARE o int; CASE WHEN i1 >= i2 THEN SET o = i1; ELSE SET o = i2; END CASE; RETURN o; END //
标签: mysql sql oracle user-defined-functions