0

つまり、ユーザー定義関数があるとします。

CREATE FUNCTION ADDRESS_EXISTS_FULL (
    line_1 VARCHAR(64),
    line_2 VARCHAR(64),
    city VARCHAR(64),
    state VARCHAR(32),
    zip VARCHAR(10),
    type INT(3)
)
RETURNS INT(1)
DETERMINISTIC
READS SQL DATA
BEGIN
    DECLARE aid INT;

    SET aid = NULL;

    SELECT addressid INTO aid FROM dlp.address as a
        WHERE a.line_1 = line_1
            AND a.line_2 = line_2
            AND a.city = city
            AND a.state = state
            AND a.zip = zip
            AND a.address_type = type
            LIMIT 1;

    RETURN IF(aid IS NOT NULL, 1, 0);

END$$

これらのいくつかが不要になるようにするにはどうすればよいですか?タイプが必要ない場合のように、とにかく呼び出すことはありますか

 SELECT ADDRESS_EXISTS_FULL(l1,l2,c, s, z)

またはそれは失敗しますか?そして、どうすればその関数を機能させることができますか?

ありがとう。

注:この関数を保存する必要はありません。1つだけなので、1つの大きなmysqlスクリプトファイルにあります。

4

1 に答える 1

0

ストアド関数本体内のクエリを次のように書き直すことができます

SELECT addressid INTO aid FROM dlp.address as a
    WHERE (a.line_1 = p_line_1 OR p_line_1 IS NULL)
        AND (a.line_2 = p_line_2 OR p_line_2 IS NULL)
         --.... etc
        LIMIT 1;

したがって、null特定のパラメーターを渡すと、そのパラメーターは無視されます。また、テーブルのフィールドとまったく同じ名前のパラメータを使用しないことをお勧めします。これにより、非常に微妙なバグが発生する可能性があります(上記のクエリでは、各パラメータの前に「p_」を追加しました)。DETERMINISTIC最後に、本質的に非決定論的である関数にはキーワードを使用しません。

于 2012-12-07T23:05:52.900 に答える