PostgreSQL中的自定义类型数组

时间:2016-11-29 18:44:14

标签: arrays database postgresql

我在Postgres中有一个自定义类型:

CREATE TYPE child AS
   (id integer,
    name text,
    surname text,
    age integer);

和表

CREATE TABLE parent
(
  id integer NOT NULL,
  name text NOT NULL,
  surname text NOT NULL,
  age integer NOT NULL,
  childs child[],
  CONSTRAINT parent_pkey PRIMARY KEY (id)
)

我希望得到一个孩子名字=“John”的父母

我尝试过类似的东西:

select id, name
  from parent
where 'John' = any  (select (unnest(childs)).name from parent)
但是我收到了所有的父母。 当有人解决我的问题时,我会非常感激。

3 个答案:

答案 0 :(得分:1)

这会有帮助吗?..

with un as (
select (unnest(childs)).name, id from parent
) 
select 
  id
, name 
from parent 
join un on un.id = parent.id 
where un.name = 'John'
;

答案 1 :(得分:1)

您必须以某种方式关联第一个父级和秒级父级。您可以使用Vao Tsun的查询或尝试使用相关查询:

select id, name
  from parent as p1
where 'John' = any  (select (unnest(childs)).name from parent as p2 where p1.id = p2.id)

答案 2 :(得分:1)

如果您对表格进行别名,则更容易看到问题:

SELECT p1.id, p1.name
FROM parent p1
WHERE 'John' = ANY (SELECT (UNNEST(p2.childs)).name FROM parent p2)

WHERE条款甚至没有提到p1;它正在查看parent表的独立副本。但是根本不需要引入该表的第二个副本:

SELECT id, name
FROM parent
WHERE 'John' = ANY (SELECT (UNNEST(childs)).name)