使用 PostgreSQL 在 SQL 查询中创建一个空数组,而不是内部包含 NULL 的数组

nun*_*ins 6 sql arrays postgresql

我正在使用以下架构:

CREATE TABLE person (
  person_name VARCHAR PRIMARY KEY
);

CREATE TABLE pet (
  animal_name VARCHAR,
  person_name VARCHAR REFERENCES person(person_name),
  PRIMARY KEY (animal_name, person_name)
);
Run Code Online (Sandbox Code Playgroud)

我希望创建一个表,对于每个person_name,我都会得到一个包含该人宠物的数组。我正在使用PostgreSQL 9.3.4

我在每个表中有以下值:

PERSON_NAME
-----------
Alice
Bob
Run Code Online (Sandbox Code Playgroud)

宠物

ANIMAL_NAME | PERSON_NAME
-------------------------
Woof        | Alice
Meow        | Alice
Run Code Online (Sandbox Code Playgroud)

我希望创建下表:

PERSON_NAME | PETS
--------------------------
Alice       | {Woof, Meow}
Bob         | {}
Run Code Online (Sandbox Code Playgroud)

但是,我无法创建空数组。我得到的是以下内容:

PERSON_NAME | PETS
--------------------------
Alice       | {Woof, Meow}
Bob         | {NULL}
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的查询:

SELECT
  person.person_name,
  array_agg(pet.animal_name) AS pets
FROM
  person LEFT JOIN pet ON person.person_name = pet.person_name
GROUP BY
  person.person_name
;
Run Code Online (Sandbox Code Playgroud)

我明白为什么我要获取包含NULL内部值的数组,我想知道如何获取空数组。

这里是一个小提琴与创建模式,插入值,并与查询我使用的代码。网站中显示的结果没有显示NULL值,尽管它在那里。

编辑

结果将被解析为 JSON,这就是为什么{NULL}不是一个可接受的结果,因为它将被解析为[null],这与[]我的要求不同。出于同样的原因,类似{""}的结果也不是可接受的结果。

小智 20

我只是想补充一点,虽然这已经是 6 岁了

数组[]::varchar[]


poz*_*ozs 2

最简单的方法是使用ARRAY构造函数的子查询变体

SELECT
  person.person_name,
  ARRAY(SELECT animal_name FROM pet WHERE person.person_name = pet.person_name) AS pets
FROM
  person;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle