6

IS_IN_ENUM('value', 'val1', 'val2', 'val3')'value'が('val1'、'val2'、'val3')にある場合にtrueを返すMySQL関数を作成しようとしています。できることはわかっています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に格納された関数は可変数の引数をサポートしていません。

MySQLUDFはCまたはC++で記述され、動的オブジェクトファイルにコンパイルされてから、異なる構文でCREATE FUNCTIONMySQLサーバーにリンクされます。

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

'value' が ('val1', 'val2', 'val3') にある場合に true を返す MySQL 関数 IS_IN_ENUM('value', 'val1', 'val2', 'val3') を作成しようとしています。

これには、ネイティブ関数 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 サーバー コードで実際に実装したい場合は、次のサブクラスを探してくださいCreate_native_funcsql/item_create.cc

于 2012-12-10T14:32:43.460 に答える
0

古い質問ですが、is_in_enum は既に組み込まれているため、作成する必要はありません。単純に select true from table where value IN (1,2,3,4); を実行します。

于 2014-07-15T08:30:36.110 に答える