我的表中有两列有多个值,我想获取其中一列而不是另一列中的值。
最好用一个例子来描述:
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)