加入一个类型为"VarChar Array"的postgresql表?

cod*_*ama 2 postgresql

直到大约5分钟前,我甚至不知道你得到的类型VARCHAR也是一个数组.我如何加入这些表格:

PEOPLE
ID | PERSON | GROUPS
1  | John   | {ONE,TWO}
2  | Jack   | {TWO}
3  | Jill   | {ONE,TWO,THREE}
4  | Jim    | {TWO,THREE}

GROUPS
ID    | TITLE
ONE   | First
TWO   | Second
THREE | Third
Run Code Online (Sandbox Code Playgroud)

我想最终得到这样的东西:

ID | PERSON | GROUP
1  | John   | ONE
1  | John   | TWO
2  | Jack   | TWO
3  | Jill   | ONE
3  | Jill   | TWO
3  | Jill   | THREE
4  | Jim    | TWO
4  | Jim    | THREE
Run Code Online (Sandbox Code Playgroud)

如何在一个查询中获得此权限?

Cra*_*ger 6

unnest 这里不需要,你可以使用一个简单的连接与数组成员资格的测试:

SELECT people."ID", people."PERSON", groups."ID"
FROM people
INNER JOIN groups ON groups."ID" = ANY (people."GROUPS")
ORDER BY people."ID", groups."ID";
Run Code Online (Sandbox Code Playgroud)

请参阅:http://sqlfiddle.com/#!12/5fa34/7

(奇怪的上层外壳是因为我无法解决修复SQLFiddle不一致的标识符引用问题.它引用了列名而不是表名.)

您甚至可以使用GIN索引people.GROUPS并获得索引连接.GIN索引的构建并不便宜,而且更新成本很高,所以你只需要在真正需要的时候这样做,但它很有用.请参阅阵列索引手册.例如:

CREATE INDEX people_groups_gin_idx ON people USING GIN("GROUPS");

SELECT people."ID", people."PERSON", groups."ID"
FROM people
INNER JOIN groups ON ARRAY[groups."ID"] @> people."GROUPS"
ORDER BY people."ID", groups."ID";
Run Code Online (Sandbox Code Playgroud)