Возьмите разницу между двумя списками в PostgreSQL - PullRequest
0 голосов
/ 27 марта 2019

В моей таблице два столбца с несколькими значениями, и я хочу получить значения, которые находятся в одном из столбцов, а не в другом столбце.

Его лучше всего описать на примере:

including_ids | excluding_ids
123, 456      | 456, 789

Я хочу создать новый столбец из всех including_ids, которых нет в excluding_ids, поэтому в приведенном выше примере:

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

Если проще, я мог бы также представлять значения в виде списков или массивов или чего-то подобного.

1 Ответ

2 голосов
/ 27 марта 2019

Для этого вы можете использовать массивы:

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)

Но, как прокомментировал ярл, используя массивы или другие составныеТипы данных часто являются плохой идеей, если вы хотите много манипулировать значениями в базе данных.Более нормализованная модель данных часто является лучшей идеей: запросы станут проще, а производительность будет лучше.

...