基于数组类型的PostgreSQL第二个查询来自第一个查询。即用数组链接查询

问题描述 投票:1回答:1

我有一个存储在数据库中的图形信息。每个节点都有一个整数id和文本标签以及一个邻接列表,它是一个整数ARRAY的ids。在第一个查询中,我将获得一个节点列表,对于结果中的每个节点,我想获得与其相邻的所有节点的名称。

CREATE TABLE graph (id INTEGER, 
                    name TEXT,
                    adj_list INTEGER[],
                    PRIMARY KEY (id)
                  );

这是我想要实现的伪代码。

let node_list = (select * from graph where name like "X%");
foreach node in node_list:
    foreach adj_node in node.adj_list:
        print adj_node.name

任何人都可以建议我如何编写PostgreSQL查询来实现这一目标?

这是一些示例数据

id | name | adj 
---+------+------------
 1 | X1   | {3, 4}
 2 | X2   | {5, 6}
 3 | Y1   | {..}
 4 | Y2   | {..}
 5 | Z1   | {..}
 6 | Z2   | {..}

我想列出名称以X开头的节点的所有相邻节点。在此示例中,结果将是{Y1,Y2,Z1,Z2}。

sql arrays postgresql
1个回答
1
投票

如果你构建像@twelfth建议的另一个表,这可能会容易得多。但是如果你想摇滚整数数组,我相信你可以这样做:

--create the table
create table graph (
  id integer,
  name text,
  adj_list integer[]
);
-- a sample insert
insert into graph (id, name, adj_list)
values
  (1, 'X1', '{3,4}'),
  (2, 'X2', '{5,6}'),
  (3, 'Y1', '{}'),
  (4, 'Y2', '{}'),
  (5, 'Z1', '{}'),
  (6, 'Z2', '{}')
;
-- use a CTE to unnest the array and give you a simple list of integers. 
-- In my opinion this CTE makes the code easier to read
with adjacent_ones as (
  select unnest(adj_list) from graph where name like 'X%'
)
select * from graph where id in (select * from adjacent_ones);

这将为您提供以下内容

--------------------------
|id  |name   |adj_list   |
--------------------------
|3   |Y1     |{}         |
|4   |Y2     |{}         |
|5   |Z1     |{}         |
|6   |Z2     |{}         |
--------------------------
© www.soinside.com 2019 - 2024. All rights reserved.