【问题标题】:Combining these queries into a function that returns将这些查询组合成一个返回的函数
【发布时间】:2019-12-31 18:28:32
【问题描述】:

我有几个查询,我试图将它们组合成一个返回一些值的函数。除了我不知道如何正确地做到这一点。

这是我试图输出的逻辑:

if((SELECT parent_id FROM event_comments WHERE comment_id = $1) == null){

    WITH cte AS (DELETE FROM event_comments WHERE thread_id = '1BZbAR'
    RETURNING parent_id, comment_id, thread_id)
    SELECT parent_id, comment_id, thread_id
    FROM cte
    WHERE parent_id IS NULL;

}else{
    DELETE FROM event_comments WHERE comment_id = $1 AND created_by = $3
    returning parent_id, comment_id, thread_id
}

获取语法错误类型“cte”不存在?

CREATE FUNCTION deleteComment(comment_id integer, created_by UUID, thread_id integer) 
RETURNS cte AS $$

BEGIN
CASE WHEN (SELECT parent_id FROM event_comments WHERE comment_id = $1) is NULL
THEN 
    WITH cte AS (
        DELETE FROM event_comments WHERE thread_id = $3
        RETURNING parent_id, comment_id, thread_id
    )
    SELECT parent_id, comment_id, thread_id
    FROM cte
    WHERE parent_id IS NULL;
ELSE
    WITH cte AS (
        DELETE FROM event_comments WHERE comment_id = $1 AND created_by = $2
        returning parent_id, comment_id, thread_id
    )

END; $$
LANGUAGE plpgsql;

【问题讨论】:

    标签: sql postgresql plpgsql


    【解决方案1】:

    在 plpgsql 函数中,您必须准确指定要返回的内容,cte 不是数据类型,而是您在函数中使用的变量。话虽如此,您应该首先声明要返回的列及其数据类型。如果您愿意,您可以自己创建数据类型,但最简单的方法是返回一个表:

    CREATE OR REPLACE FUNCTION 
      deleteComment(comment_id_in INT, created_by_in UUID, thread_id_in INT) 
    RETURNS TABLE (parent_id_out INT, comment_id_out INT, thread_id_out INT) AS $$
    BEGIN
      IF (SELECT parent_id FROM event_comments WHERE comment_id = $1) IS NULL THEN
        RETURN QUERY DELETE FROM event_comments 
          WHERE thread_id = $3
          RETURNING parent_id, comment_id, thread_id;
      ELSE
        RETURN QUERY DELETE FROM event_comments 
          WHERE comment_id = $1 AND created_by = $2
          RETURNING parent_id, comment_id, thread_id;
      END IF;
    END;
    $$ LANGUAGE plpgsql;
    

    样本数据:

    CREATE TEMPORARY TABLE event_comments 
    (comment_id INT, parent_id INT, thread_id INT, created_by UUID);
    INSERT INTO event_comments VALUES (1,1,1,'123e4567-e89b-12d3-a456-426655440000');
    

    测试:

    SELECT * FROM deleteComment(1,'123e4567-e89b-12d3-a456-426655440000',4);
    
     parent_id_out | comment_id_out | thread_id_out 
    ---------------+----------------+---------------
                 1 |              1 |             1
    (1 Zeile)
    

    查看this answer 以获得更简洁的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      相关资源
      最近更新 更多