首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中使用可选参数创建函数

问在MySQL中使用可选参数创建函数
EN

Stack Overflow用户
提问于 2011-02-03 19:42:25
回答 3查看 39.1K关注 0票数 24

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

EN

回答 3

Stack Overflow用户

发布于 2011-05-22 23:46:38

不能在MySQL存储过程中设置可选参数。

但是,可以在MySQL UDF中设置可选参数。

您一定知道MySQL有一个AVG aggregate function

变通方法如果你能面对这个变通方法的丑陋,这里的示例代码使用逗号分隔的字符串和值作为输入,并返回平均值。

代码语言:javascript
复制
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提供函数。

代码语言:javascript
复制
SELECT MyAvg(CONCAT_WS(',',100,200,300,500)) AS test;

您还可以在C(++)或Delphi/Lazarus中使用write an UDF

票数 5
EN

Stack Overflow用户

发布于 2012-10-05 22:11:59

虽然远不是一个理想的解决方案,但以下是我如何为我需要的concat函数解决可选参数的方法:

代码语言:javascript
复制
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
||

注意:这意味着您必须调用与参数数量相对应的方法。

票数 4
EN

Stack Overflow用户

发布于 2016-03-24 05:32:10

另一种方法是只传递一个“超级”参数,该参数是字符串,其中用逗号分隔实际参数。然后,mysql过程可以将“超级”参数解析为单独的实参数。示例:

代码语言:javascript
复制
create procedure procWithOneSuperParam(param1 varchar(500))
declare param2 varchar(100);
begin
 if LOCATE(',',param1) > 0 then
  .. param2=<extract the string after the ',' from param1> ..
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4885675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档