找出PostgreSQL中两个列表的区别

时间:2019-03-27 14:43:08

标签: sql postgresql compare difference

我的表中有两个带有多个值的列,我想获取其中一个列而不是另一列中的值。

最好用一个例子来描述:

including_ids | excluding_ids
123, 456      | 456, 789

我想为including_ids之外的所有excluding_ids创建一个新列,因此在上面的示例中:

including_ids | excluding_ids | remaining_ids
123, 456      | 456, 789      | 123

如果更容易,我还可以将值表示为列表或数组之类。

1 个答案:

答案 0 :(得分:2)

您可以为此使用数组:

CREATE TABLE mytable (including_ids integer[], excluding_ids integer[]);

INSERT INTO mytable VALUES ('{123,456}', '{456,789}');
INSERT INTO mytable VALUES ('{1,2,3}', '{3,4,5}');

然后您可以像这样获得所需的结果:

SELECT (SELECT array_agg(i)
        FROM unnest(m.including_ids) AS arr(i)
        WHERE NOT ARRAY[i] <@ m.excluding_ids)
FROM mytable AS m;

 array_agg 
-----------
 {123}
 {1,2}
(2 rows)

但是,正如jarlh所评论的那样,如果您想对数据库内部的值进行大量操作,那么使用数组或其他复合数据类型通常是个坏主意。规范化的数据模型通常是一个更好的主意:查询将变得更简单,并且性能会更好。