SQL从一组id创建一个串联的名称字符串

时间:2014-01-30 21:43:40

标签: sql arrays postgresql

我正在使用Streamtask和xReporter开发报告。最近,我们的数据库已更新,允许将多个项目分配给单个任务。为实现这一目标,使用包含一组CSV索引值的字符串来替换旧的单个索引,即:'[1,2,3,4]'而不是1.因此,我们现在必须更新大量报告

为了解决这个问题,我替换了原来的选择语句:

(select prj.name from project_table prj where prj.id=t.project_id) as project, 

这一行:

(select prj.name from project_table prj where prj.id = ANY((string_to_array(btrim(task_table.projects, '[]'), ','))::integer[])) as project,

将字符串(成功)转换为整数值数组。

问题是我必须能够获取这个索引数组并检索与每个索引关联的每个项目名称,并将它们连接成一个包含项目名称列表的字符串。

因为我必须在xReporter报告中实现这一点,所以我相信我需要一个仅针对我的问题的SQL解决方案。

1 个答案:

答案 0 :(得分:2)

在关系数据库中存储逗号分隔值是一种非常可怕的反模式。

Postgres有一些非常好的功能来解决这个设计错误,这使得查询实际上很容易(但可能不是很快)

select prj.name, tsk.id as task_id
from project_table prj
  join ( 
     select id, regexp_split_to_table(projects, ',')::int as pid
     from task_table
  ) tsk on tsk.pid = prj.id
order by prj.id

你原来的陈述看起来好像是把它嵌入到一个更大的陈述中,所以我不确定加入是多么合适。但是你总是可以使用上面的方法(内部派生表)在错误设计的表上创建一个标准化视图。

这是一个SQLFiddle:http://sqlfiddle.com/#!15/6f9bb/1