在MySQL中使用可选参数创建一个函数

时间:2011-02-03 11:42:25

标签: mysql function arguments

我想在MySQL中创建一个带有可选参数的函数。例如,我想创建计算其参数平均值的函数。我创建了一个包含五个参数的函数,但是当用户只向函数传递两个参数时,它仍然应该运行并返回两个参数的平均值。

3 个答案:

答案 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 UDFC(++)

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> ..