6

我正在尝试创建一个 MySQL 函数IS_IN_ENUM('value', 'val1', 'val2', 'val3'),如果“value”在(“val1”、“val2”、“val3”)中,则该函数返回 true。我知道我可以做到SELECT 'value' IN ('val1', 'val2', 'val3'),但这没那么有趣,因为我只想学习如何创建这样的函数。

我给你一个例子,考虑以下ADD函数:

CREATE FUNCTION my_add (
    a DOUBLE,
    b DOUBLE
)
RETURNS DOUBLE
BEGIN

    IF a IS NULL THEN
        SET a = 0;
    END IF;

    IF b IS NULL THEN
        SET b = 0;
    END IF;

    RETURN (a + b);
END;

如果我这样做SELECT my_add(1, 1),我会得到 2(哇!)。

如何改进此功能以便能够调用:

SELECT my_add(1, 1); -- 2
SELECT my_add(1, 1, 1); -- 3
SELECT my_add(1, 1, 1, 1); -- 4
SELECT my_add(1, 1, 1, 1, 1, 1, .....); -- n
4

3 回答 3

6

您展示的函数示例是存储函数,而不是 UDF。正如@Enzino 回答的那样,MySQL 中的存储函数不支持可变数量的参数。

MySQL UDF 是用 C 或 C++ 编写的,编译成动态对象文件,然后使用不同的语法CREATE FUNCTION与 MySQL 服务器链接。

有关编写 UDF 的详细信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/adding-udf.html。但我不知道您是否想编写 C/C++ 代码来执行此操作。

MySQL UDF 确实支持可变数量的参数。事实上,所有 UDF 都隐式接受任意数量的参数,作为程序员,您可以确定给定参数的数量和数据类型是否对您的函数有效。

UDF 中的处理函数参数记录在http://dev.mysql.com/doc/refman/5.5/en/udf-arguments.html

于 2012-12-09T18:16:59.260 回答
1

我正在尝试创建一个 MySQL 函数 IS_IN_ENUM('value', 'val1', 'val2', 'val3') 如果 'value' 在 ('val1', 'val2', 'val3') 中则返回 true。

为此,您可以使用本机函数 FIELD:

http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_field

IS_IN_ENUM 表示 FIELD != 0。

还要检查 FIND_IN_SET

http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_find-in-set

存储函数不支持可变数量的参数。

现在,如果你真的想在 MySQL 服务器代码中自己实现这样的原生函数,请寻找 in 的子Create_native_funcsql/item_create.cc

于 2012-12-10T14:32:43.460 回答
0

老问题,但您不需要创建 is_in_enum 因为它已经内置。只需从值 IN (1,2,3,4) 的表中选择 true;

于 2014-07-15T08:30:36.110 回答