Предполагая, что у вас есть таблица с идентификаторами и значениями для скорой помощи, полиции и огня, вы можете использовать что-то вроде следующего.
CREATE TABLE public.test1
(
id integer NOT NULL,
commastring character varying,
CONSTRAINT pk_test1 PRIMARY KEY (id)
);
INSERT INTO public.test1
VALUES (1, '1,2,3'), (2, '1,2'), (3, '1');
CREATE TABLE public.test2
(
id integer NOT NULL,
description character varying,
CONSTRAINT pk_test2 PRIMARY KEY (id)
);
INSERT INTO public.test2
VALUES (1, 'Ambulance'), (2, 'Fire'), (3, 'Police');
with descs as
(with splits as
(SELECT id, split_part(commastring, ',', 1) as col2,
split_part(commastring, ',', 2) as col3, split_part(commastring, ',', 3) as col4 from test1)
select splits.id, t21.description as d1, t22.description as d2, t23.description as d3
from splits
inner join test2 t21 on t21.id::character varying = splits.col2
left join test2 t22 on t22.id::character varying = splits.col3
left join test2 t23 on t23.id::character varying = splits.col4)
SELECT descs.id, CASE WHEN d2 IS NOT NULL AND d3 IS NOT NULL
THEN CONCAT_WS(',', d1,d2,d3) ELSE CASE WHEN d2 IS NOT NULL
THEN CONCAT_WS(',', d1,d2) ELSE d1 END END FROM descs
ORDER BY id;
В качестве пояснения я даю команды создания таблицы и вставки, чтобы вы (и другие) могли следовать логике. Было бы очень полезно, если бы вы делали это в своих вопросах, так как это экономит время каждого и избегает недопонимания.
Мой внутренний CTE затем разбивает строку, используя split_part
. Синтаксис здесь довольно прост: поле, разделитель и требуемый столбец внутри поля, которое нужно разделить (поэтому в этом случае нам нужны один, два и три). Затем я присоединяюсь к разделенным столбцам в test2. Обратите внимание на две вещи: первое соединение - это внутреннее соединение, так как в разбиении всегда будет хотя бы один столбец (я предполагаю !!!), тогда как два других остаются левыми соединениями; во-вторых, разделение поля с изменяющимся символом, в свою очередь, приводит к разделению символов, поэтому я должен привести int id к символу, меняющемуся, чтобы объединение работало. Выполнение приведения таким образом (то есть идентификатор к изменяющемуся символу, а не к изменяющемуся символу для идентификатора) означает, что мне не нужно беспокоиться о нулях. Наконец, в зависимости от количества присутствующих нулей, я объединяю результаты с данным разделителем. Опять же, я предполагаю, что d1 всегда будет иметь значение.
НТН