Создайте функцию с необязательными аргументами в MySQL - PullRequest
21 голосов
/ 03 февраля 2011

Я хочу создать функцию с необязательными аргументами в MySQL.Например, я хочу создать функцию, которая вычисляет среднее значение ее аргументов.Я создаю функцию из пяти аргументов, но когда пользователь передает в функцию только два аргумента, она все равно должна работать и возвращать среднее значение двух аргументов.

Ответы [ 3 ]

5 голосов
/ 05 октября 2012

Хотя это далеко не идеальное решение, вот как я решил необязательные параметры для нужной мне функции 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
||

Примечание. Это означает, что вам нужно вызывать метод, который соответствует числу аргументов.

5 голосов
/ 22 мая 2011

Нельзя установить дополнительные параметры в хранимых процедурах MySQL.
Однако вы можете установить дополнительные параметры в MySQL UDF.

Вы знаете, что MySQL имеет агрегатную функцию AVG ?

Обход Если вы можете столкнуться с уродством этого обходного пути, вот пример кода, который использует разделенную запятыми строку со значениями в качестве входных данных и возвращает среднее значение.

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;

Вы также можете написать UDF в C (++) или Delphi / Lazarus

1 голос
/ 24 марта 2016

Другой подход заключается в передаче только одного «супер» параметра, который представляет собой строку с запятыми в ней, разделяющую реальные параметры.Затем процедура mysql может анализировать параметр super в отдельные реальные параметры.Пример:

create procedure procWithOneSuperParam(param1 varchar(500))
declare param2 varchar(100);
begin
 if LOCATE(',',param1) > 0 then
  .. param2=<extract the string after the ',' from param1> ..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...