假设您有一个包含 Ambulance、Police 和 Fire 的 id 和值的表,那么您可以使用如下所示的内容。
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 转换为字符变化才能使连接起作用。以这种方式进行强制转换(即 id 到字符变化而不是字符变化到 id)意味着我不必为空值而烦恼。最后,根据存在的空值的数量,我将结果与给定的分隔符连接起来。我再次假设 d1 总是有一个值。
HTH