Sql 将这些查询组合成一个返回

Sql 将这些查询组合成一个返回,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我有几个查询,我正试图将它们组合成一个函数,返回一些值。除了我不知道怎么做才对 这是我试图输出的逻辑: 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)

我有几个查询,我正试图将它们组合成一个函数,返回一些值。除了我不知道怎么做才对

这是我试图输出的逻辑:

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;

在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)
查看更紧凑的示例