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,发生错误是因为我猜到了您使用的类型。请参阅更新的答案。