sql中返回表的函数(Postgres sql)

sql中返回表的函数(Postgres sql),sql,postgresql,Sql,Postgresql,我有以下查询返回一个表: WITH RECURSIVE EXPL (parent_node, node, filename) AS ( SELECT ROOT.parent_node, ROOT.node, ROOT.filename FROM filesystem ROOT WHERE ROOT.parent_node = 1 UNION ALL SELECT CHILD.parent_node, CHILD.

我有以下查询返回一个表:

WITH RECURSIVE EXPL (parent_node, node, filename) AS
     (
      SELECT ROOT.parent_node, ROOT.node, ROOT.filename
      FROM   filesystem   ROOT
      WHERE  ROOT.parent_node = 1

      UNION ALL

      SELECT CHILD.parent_node, CHILD.node, CHILD.filename
      FROM   EXPL PARENT, filesystem CHILD
      WHERE  PARENT.node = CHILD.parent_node
     )

     SELECT   DISTINCT parent_node, node, filename
     FROM     EXPL
     ORDER BY parent_node, node;
END
但是我想要一个函数,用
WHERE ROOT.parent\u node=x
替换
WHERE ROOT.parent\u node=1
。X是一个整数,它是函数参数

我想了想,但根本不对:

CREATE FUNCTION childs(x INT) RETURNS TABLE 
RETURN
WITH RECURSIVE EXPL (parent_node, node, filename) AS
     (
      SELECT ROOT.parent_node, ROOT.node, ROOT.filename
      FROM   filesystem   ROOT
      WHERE  ROOT.parent_node = x

      UNION ALL

      SELECT CHILD.parent_node, CHILD.node, CHILD.filename
      FROM   EXPL PARENT, filesystem CHILD
      WHERE  PARENT.node = CHILD.parent_node
     )

     SELECT   DISTINCT parent_node, node, filename
     FROM     EXPL
     ORDER BY parent_node, node;
END;

您的函数定义在
返回之后缺少一个
开始
和一个
查询

CREATE OR REPLACE FUNCTION childs(x int) 
RETURNS TABLE (parent_node integer, node integer, filename varchar(255)) AS
$function$
BEGIN 
RETURN QUERY
WITH RECURSIVE expl (parent_node, node, filename) AS
     (
      SELECT root.parent_node, root.node, root.filename
      FROM   filesystem   root
      WHERE  root.parent_node = x

      UNION ALL

      SELECT child.parent_node, child.node, child.filename
      FROM   expl parent, filesystem child
      WHERE  parent.node = child.parent_node
     )

     SELECT   DISTINCT expl.parent_node, expl.node, expl.filename
     FROM     expl
     ORDER BY parent_node, node;
END 
$function$ LANGUAGE plpgsql;
使用如下函数:

SELECT * FROM childs(1)

用您正在使用的数据库标记您的问题。不是所有的数据库都支持用户定义的表函数。好的,我使用Postgresup。建议:您可以通过将语言plpgsql更改为sql,然后删除begin/end、return等来简化。从childs(1)调用SELECT*后,我得到错误:查询的结构与函数结果类型不匹配。返回的类型字符变量(255)与第3列中的预期类型文本不匹配。@马克,你能用一些样本数据更新这个问题吗?这样我就可以测试它了。@Haleemur Alidid@Marc,发生错误是因为我猜到了您使用的类型。请参阅更新的答案。