在Postgresql递归查询中搜索字段
Search for field in Postgresql recursive query
我需要从自链接 table 制作树,例如:
CREATE TABLE tree(
id serial primary key,
parent int4,
text_field varchar(255)
);
关于递归 CTE 的主题讲述了当 select 语句的递归部分没有行时递归查询停止执行递归。我需要某种深度搜索,我的查询方式不对:
WITH RECURSIVE tree_query as(
SELECT T0.id, T0.parent, T0.text_field
FROM tree T0
WHERE T0.parent is null --search from root
UNION
SELECT TT0.id, TT0.parent, TT0.text_field
FROM tree TT0
INNER JOIN tree_query t ON t.id = TT0.parent
WHERE TT0.text_field LIKE '%smth%'
)
SELECT * FROM tree_query;
它出错的主要原因 - 当我在 3 级无限中搜索某些东西时它停止执行,因为在查询的递归部分没有相关行,我只得到一个根。
搜索直到找到
WITH RECURSIVE tree_query as(
SELECT T0.id, T0.parent, T0.text_field, (T0.text_field LIKE '%smth%') as found
FROM tree T0
WHERE T0.parent is null --search from root
UNION
SELECT TT0.id, TT0.parent, TT0.text_field, (TT0.text_field LIKE '%smth%')
FROM tree TT0
INNER JOIN tree_query t ON t.id = TT0.parent
WHERE NOT t.found
)
SELECT *
FROM tree_query
WHERE found;
查询将在每个分支中找到第一个匹配的节点。
我需要从自链接 table 制作树,例如:
CREATE TABLE tree(
id serial primary key,
parent int4,
text_field varchar(255)
);
关于递归 CTE 的主题讲述了当 select 语句的递归部分没有行时递归查询停止执行递归。我需要某种深度搜索,我的查询方式不对:
WITH RECURSIVE tree_query as(
SELECT T0.id, T0.parent, T0.text_field
FROM tree T0
WHERE T0.parent is null --search from root
UNION
SELECT TT0.id, TT0.parent, TT0.text_field
FROM tree TT0
INNER JOIN tree_query t ON t.id = TT0.parent
WHERE TT0.text_field LIKE '%smth%'
)
SELECT * FROM tree_query;
它出错的主要原因 - 当我在 3 级无限中搜索某些东西时它停止执行,因为在查询的递归部分没有相关行,我只得到一个根。
搜索直到找到
WITH RECURSIVE tree_query as(
SELECT T0.id, T0.parent, T0.text_field, (T0.text_field LIKE '%smth%') as found
FROM tree T0
WHERE T0.parent is null --search from root
UNION
SELECT TT0.id, TT0.parent, TT0.text_field, (TT0.text_field LIKE '%smth%')
FROM tree TT0
INNER JOIN tree_query t ON t.id = TT0.parent
WHERE NOT t.found
)
SELECT *
FROM tree_query
WHERE found;
查询将在每个分支中找到第一个匹配的节点。