静态表

时间:2016-07-28 17:45:41

标签: arrays postgresql dynamic-sql

我使用PostgreSQL协调大规模模拟,包括通过整数数组初始化我的应用程序的各个组件。特别是,我有一个" Controller"的概念,其中每个控制器需要初始化可变数量的参数。

我有一个job表,它存储controller_idcontroller_parameters外键,用于实际链接到我们想要的参数集。我的想法是开始做以下事情:

  1. 使用controller_id动态选择一个表名,从中选择初始化参数。这些表中的每一个都有一个controller_parameters列,用于将实际初始化数据链接到源表。

  2. 了解完表后,请运行SELECT * FROM @someController_parameters_table p WHERE p.controller_parameters = controller_parameters LIMIT 1;

  3. 将这些放入自定义类型,该类型具有要返回给客户端的整数数组字段。

  4. 主要问题是这有动态SQL,我听说这不是一件好事。

    我建议的更改是设置一个新表,让我们说controller_parameters,其中包含(controller_id, parameters_id, parameters[])列。第三列存储单个控制器和参数集的初始化参数。

    这种设计的优点是我们回到静态SQL领域,这很好。可以肯定的是,当我生成要插入到各个参数表的实际参数时,我通常使用交叉连接来获取各个参数的所有排列,并相应地将它们插入到各个表中。我个人不知道如何采用交叉连接的表格行并将其转换为int[],这是一个潜在的障碍。

    思想?

1 个答案:

答案 0 :(得分:0)

您可以使用array_agg获取组的结果并将其转换为数组。

select controller_id, parameters_id, array_agg(parameter) 
from ... 
group by controller_id, parameters_id

这里有关于聚合函数的postgresql文档:

https://www.postgresql.org/docs/9.5/static/functions-aggregate.html