整数文本数组,用于连接Postgres中的表

时间:2019-11-14 11:57:23

标签: postgresql casting inner-join

我有两个桌子

  1. 实体
  2. 房屋

在内部表格中,存在一列类型为text的entity_id。 而且entity_id将存储多个房屋ID。

所以看起来像

entity_id (text)
------------------
[1,2]
[3,6]

现在,我必须将此实体表与内部表连接起来。 我将如何实现这一目标。 我知道这可能不是一个好的设计。尽管现在这是我的责任。

2 个答案:

答案 0 :(得分:1)

这应该有效:

CREATE TABLE entity(
  id integer,
  entity_id integer[],
  details text
);

CREATE TABLE houses(
  id integer,
  house_name text
);

INSERT INTO entity(id, entity_id, details)
VALUES
(1, '{1,3}', 'Left side houses'),
(2, '{2,4}', 'Right side houses');

INSERT INTO houses(id, house_name)
VALUES
(1, 'Left 1'),
(2, 'Right 1'),
(3, 'Left 2'),
(4, 'Right 2');

----------------------------------------------
SELECT h.id as house_id, h.house_name, e.details
FROM houses h
LEFT JOIN entity e 
ON h.id = ANY(e.entity_id);
| house_id | house_name | details           |
| -------- | ---------- | ----------------- |
| 1        | Left 1     | Left side houses  |
| 2        | Right 1    | Right side houses |
| 3        | Left 2     | Left side houses  |
| 4        | Right 2    | Right side houses |

答案 1 :(得分:1)

正如Laurenz在评论中所说:这里似乎是模型化的错误。

所以我不会直接回答这个问题,但会给出一个最正确的结构:

CREATE TABLE entity (id int primary key);
CREATE TABLE house (id int primary key);
CREATE TABLE entity_house (id bigserial, identity int references entity(id), idhouse int references house(id));

INSERT INTO entity VALUES (1), (2);
INSERT INTO house VALUES (3), (56);
INSERT INTO entity_house (identity, idhouse) VALUES (1,56), (2,56);

SELECT e.*, h.*
FROM entity_house eh
    INNER JOIN entity e ON eh.identity = e.id
    INNER JOIN house h ON eh.idhouse = h.id;