以PostgreSQL中两个列表之间的差异为例



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

最好用一个例子来描述:

including_ids | excluding_ids
123, 456      | 456, 789

我想创建一个不在excluding_ids中的所有including_ids的新列,所以在上面的例子中:

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

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

你可以为此使用数组:

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所评论的那样,如果你想大量操作数据库中的值,使用数组或其他复合数据类型通常是一个坏主意。更规范化的数据模型通常是一个更好的主意:查询将变得更简单,性能也会更好。

您也可以

使用 intarray 扩展:

create extension intarray;
SELECT including_ids - excluding_ids as remaining_ids
FROM mytable;
 remaining_ids 
───────────────
 {123}
 {1,2}
(2 rows)

相关内容

  • 没有找到相关文章

最新更新