SQL:是否重用函数返回的值?

SQL:是否重用函数返回的值?,sql,postgresql,variables,sql-insert,sql-function,Sql,Postgresql,Variables,Sql Insert,Sql Function,如何重用在下面的函数中调用的pair返回的值 CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$ INSERT INTO chats SELECT pair($1, $2), $1, $2 WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair($1, $2)); INSERT INTO messages VALUES (pa

如何重用在下面的函数中调用的
pair
返回的值

CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$
    INSERT INTO chats SELECT pair($1, $2), $1, $2
        WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair($1, $2));
    INSERT INTO messages VALUES (pair($1, $2), $1, $3);
$$ LANGUAGE SQL;
我知道这是一种典型的编程语言。因此,我查看了,但我不确定是否应该将
一起使用,而且无论如何,我无法找出正确的语法

  • 这是我和我最初的问题。然后,此函数插入。我之所以不使用事务,是因为我想让事情保持快速,而存储一个没有消息的聊天记录并不是那么糟糕,相反更糟糕。所以,查询顺序很重要。如果有更好的方法,请提出建议

  • 我想重用这个值主要是为了加快代码的速度。但是,SQL解释器是否会自动优化上述函数?尽管如此,我还是想写出好的代码

  • 它只会在聊天中存在时插入到消息中

    它只会在聊天中存在时插入到消息中

    它只会在聊天中存在时插入到消息中


    它仅在聊天中存在时才会插入消息。

    由于函数体是过程性的,请使用与SQL相反的语言:

    CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$
    BEGIN
        INSERT INTO chats
            SELECT pair($1, $2), $1, $2
            WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair($1, $2));
        INSERT INTO messages VALUES (pair($1, $2), $1, $3);
    END
    $$ LANGUAGE plpgsql;
    
    此外,如果重用的结果是
    pair($1,$2)
    ,则可以将其存储到变量中:

    CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$
    DECLARE
        pair bigint := pair($1, $2);
    BEGIN
        INSERT INTO chats
            SELECT pair, $1, $2
            WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair);
        INSERT INTO messages VALUES (pair, $1, $3);
    END
    $$ LANGUAGE plpgsql;
    

    由于函数体是过程性的,因此请使用与SQL相反的语言:

    CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$
    BEGIN
        INSERT INTO chats
            SELECT pair($1, $2), $1, $2
            WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair($1, $2));
        INSERT INTO messages VALUES (pair($1, $2), $1, $3);
    END
    $$ LANGUAGE plpgsql;
    
    此外,如果重用的结果是
    pair($1,$2)
    ,则可以将其存储到变量中:

    CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$
    DECLARE
        pair bigint := pair($1, $2);
    BEGIN
        INSERT INTO chats
            SELECT pair, $1, $2
            WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair);
        INSERT INTO messages VALUES (pair, $1, $3);
    END
    $$ LANGUAGE plpgsql;
    

    由于函数体是过程性的,因此请使用与SQL相反的语言:

    CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$
    BEGIN
        INSERT INTO chats
            SELECT pair($1, $2), $1, $2
            WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair($1, $2));
        INSERT INTO messages VALUES (pair($1, $2), $1, $3);
    END
    $$ LANGUAGE plpgsql;
    
    此外,如果重用的结果是
    pair($1,$2)
    ,则可以将其存储到变量中:

    CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$
    DECLARE
        pair bigint := pair($1, $2);
    BEGIN
        INSERT INTO chats
            SELECT pair, $1, $2
            WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair);
        INSERT INTO messages VALUES (pair, $1, $3);
    END
    $$ LANGUAGE plpgsql;
    

    由于函数体是过程性的,因此请使用与SQL相反的语言:

    CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$
    BEGIN
        INSERT INTO chats
            SELECT pair($1, $2), $1, $2
            WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair($1, $2));
        INSERT INTO messages VALUES (pair($1, $2), $1, $3);
    END
    $$ LANGUAGE plpgsql;
    
    此外,如果重用的结果是
    pair($1,$2)
    ,则可以将其存储到变量中:

    CREATE FUNCTION messages_add(bigint, bigint, text) RETURNS void AS $$
    DECLARE
        pair bigint := pair($1, $2);
    BEGIN
        INSERT INTO chats
            SELECT pair, $1, $2
            WHERE NOT EXISTS (SELECT 1 FROM chats WHERE id = pair);
        INSERT INTO messages VALUES (pair, $1, $3);
    END
    $$ LANGUAGE plpgsql;
    
  • 事实上,我对你的这部分问题没有答案,但我还是要解决它,因为

  • 嗯。现在,我们在2,:-)。所以,顺序实际上并不重要,因为两个插入将在一个事务中一起提交

  • 不,当使用常量(非变量)参数调用不可变函数时,优化器仅对其进行预计算,例如,
    pair(4,5)
    。看

  • 事实上,我对你的这部分问题没有答案,但我还是要解决它,因为

  • 嗯。现在,我们在2,:-)。所以,顺序实际上并不重要,因为两个插入将在一个事务中一起提交

  • 不,当使用常量(非变量)参数调用不可变函数时,优化器仅对其进行预计算,例如,
    pair(4,5)
    。看

  • 事实上,我对你的这部分问题没有答案,但我还是要解决它,因为

  • 嗯。现在,我们在2,:-)。所以,顺序实际上并不重要,因为两个插入将在一个事务中一起提交

  • 不,当使用常量(非变量)参数调用不可变函数时,优化器仅对其进行预计算,例如,
    pair(4,5)
    。看

  • 事实上,我对你的这部分问题没有答案,但我还是要解决它,因为

  • 嗯。现在,我们在2,:-)。所以,顺序实际上并不重要,因为两个插入将在一个事务中一起提交

  • 不,当使用常量(非变量)参数调用不可变函数时,优化器仅对其进行预计算,例如,
    pair(4,5)
    。看


  • 谢谢,克洛多尔多!但是,我希望它插入到
    消息中
    ,即使该行已经存在于
    聊天中
    ,以便您可以将多条消息添加到一个聊天中。我所说的聊天,是指对话或线程。谢谢,克洛多尔多!但是,我希望它插入到
    消息中
    ,即使该行已经存在于
    聊天中
    ,以便您可以将多条消息添加到一个聊天中。我所说的聊天,是指对话或线程。谢谢,克洛多尔多!但是,我希望它插入到
    消息中
    ,即使该行已经存在于
    聊天中
    ,以便您可以将多条消息添加到一个聊天中。我所说的聊天,是指对话或线程。谢谢,克洛多尔多!但是,我希望它插入到
    消息中
    ,即使该行已经存在于
    聊天中
    ,以便您可以将多条消息添加到一个聊天中。聊天,我指的是对话或线程。为什么使用PL/pgSQL作为过程的函数体有好处?@MattDiPasquale:PL代表过程语言,它提供了SQL在变量和执行控制方面所缺乏的东西。SQL作为func语言的优点是可以内联单个选择,但它不适用于两个插入的情况。为什么函数体是使用PL/pgSQL的过程优点?@MattDiPasquale:PL代表过程语言,它提供了SQL在变量和执行控制方面所缺少的东西。SQL作为func语言的优点是可以内联单个选择,但它不适用于两个插入的情况。为什么函数体是使用PL/pgSQL的过程优点?@MattDiPasquale:PL代表过程语言,它提供了SQL在变量和执行控制方面所缺少的东西。SQL作为func语言的优点是可以内联单个选择,但它不适用于两个插入的情况。为什么函数体是使用PL/pgSQL的过程优点?@MattDiPasquale:PL代表过程语言,它提供了SQL在变量和执行控制方面所缺少的东西。SQL作为func语言的优点是可以内联单个选择,但它不适用于两个插入的情况。