我想在MySQL中创建一个带有可选参数的函数。例如,我想创建计算其参数平均值的函数。我创建了一个包含五个参数的函数,但是当用户只向函数传递两个参数时,它仍然应该运行并返回两个参数的平均值。
答案 0 :(得分:5)
您无法在MySQL存储过程中设置可选参数 但是,您可以在MySQL UDF中设置可选参数。
你知道MySQL有一个AVG aggregate function吗?
解决方法强> 如果你可以面对这个变通方法的丑陋,这里的samplecode使用逗号分隔的字符串,其值为输入并返回平均值。
DELIMITER $$
CREATE FUNCTION MyAvg(valuestr varchar) RETURNS float
BEGIN
DECLARE output float;
DECLARE arg_count integer;
DECLARE str_length integer;
DECLARE arg float;
DECLARE i integer;
SET output = NULL;
SET i = LENGTH(valuestr);
IF i > 0 THEN BEGIN
SET arg_count = 1;
WHILE i > 0 DO BEGIN
IF MID(valuestr, i, 1)
SET i = i - 1;
END; END WHILE;
/* calculate average */
SET output = 0;
SET i = arg_count;
WHILE i > 0 DO BEGIN
SET arg = SUBSTRING_INDEX(
SUBSTRING_INDEX(valuestr, ',' , i)
, ',', -1 );
SET output = output + arg;
SET i = i - 1;
END; END WHILE;
SET output = output / arg_count;
END; END IF;
RETURN output;
END $$
DELIMITER ;
使用concat_ws提供功能。
SELECT MyAvg(CONCAT_WS(',',100,200,300,500)) AS test;
您还可以在write an UDF或C(++)
中Delphi/Lazarus答案 1 :(得分:5)
虽然远非理想的解决方案,但这是我如何解决我需要的concat函数的可选参数:
delimiter ||
create function safeConcat2(arg1 longtext, arg2 varchar(1023))
returns longtext
return safeConcat3(arg1, arg2, '');
||
create function safeConcat3(arg1 longtext, arg2 varchar(1023), arg3 varchar(1023))
returns longtext
return safeConcat4(arg1, arg2, arg3, '');
||
create function safeConcat4(arg1 longtext, arg2 varchar(1023), arg3 varchar(1023), arg4 varchar(1023))
returns longtext
begin
declare result longText;
set result = concat(arg1, arg2, arg3, arg4);
if( result is null) then
set result=arg1;
end if;
return result;
end
||
注意:这意味着您必须调用与args数相对应的方法。
答案 2 :(得分:1)
另一种方法是只通过一个超级'参数,它是用逗号分隔实际参数的字符串。然后mysql程序可以解析超级'参数分成实际参数。 例如:
create procedure procWithOneSuperParam(param1 varchar(500))
declare param2 varchar(100);
begin
if LOCATE(',',param1) > 0 then
.. param2=<extract the string after the ',' from param1> ..