加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL:循环直到条件为真

发布时间:2020-12-13 16:05:31 所属栏目:百科 来源:网络整理
导读:我试图编写一个查询,它从一个数据库“循环”开始于指定的值,直到条件为真.例如,假设我在TABLE示例中有以下条目: id,parent,cond1,True2,1,False3,False4,2,False... ... ... 我想要一个查询作为输入(例如)4,并将返回值2和1.过程是查询匹配id,如果cond == Fa
我试图编写一个查询,它从一个数据库“循环”开始于指定的值,直到条件为真.例如,假设我在TABLE示例中有以下条目:

id,parent,cond
1,True
2,1,False
3,False
4,2,False
... ... ...

我想要一个查询作为输入(例如)4,并将返回值2和1.过程是查询匹配id,如果cond == False,将查看父项(id = 2) ).由于第二行中cond = False,因此将选择“父”id(1).现在看第一行,因为cond = True,LOOP结束并返回1和2.

我知道查询

SELECT parent FROM example WHERE id = 4;

将生成父ID 2.

所以我徒劳地尝试创建一个循环:

WHILE (SELECT cond FROM example) = False
LOOP SELECT parent FROM example WHERE id = 4 
END LOOP;

首先,这会产生错误(“语法错误在’或’附近”).其次,我不知道如何在每次迭代后更新“id”.

在像Python这样的编程语言中,我可能会使用一个初始化为4的变量,然后在每次迭代时更新它…不确定如何在Postgres中执行等效操作.

如果您有任何疑问或需要其他信息,请与我们联系.谢谢!

解决方法

您对SQL的想法是错误的.不要考虑循环,条件和变量;相反,考虑如何描述您想要的数据.棘手的部分是你希望查询引用它自己的结果,这就是 recursive CTEs的用途:

The optional RECURSIVE modifier changes WITH from a mere syntactic convenience into a feature that accomplishes things not otherwise possible in standard SQL. Using RECURSIVE,a WITH query can refer to its own output.

你正在寻找这样的东西:

with recursive path as (
    select id,parent from T where id = 4
    union all
    select t.id,t.parent from T t join path p on t.id = p.parent
)
select id,parent
from path

这会给你这个:

id | parent 
----+--------
  4 |      2
  2 |      1
  1 |

然后你可以把它放回到一个路径中,这个路径在数据库之外会更加链接 – 列表(或者你的客户语言中适合的任何东西).您当然不必包括父级,但包括它将帮助您修复“指针”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读