Django Postgresql生成的列需要多个整数数组列的总和

Django Postgresql生成的列需要多个整数数组列的总和,django,postgresql,django-forms,postgresql-12,Django,Postgresql,Django Forms,Postgresql 12,我有一个表,它有两个整数列和两个整数数组列,其中保存着分数。例如,我的行如下所示: { physical_ed: 40, music: 90, first_term: {10,23,43}, second_term: {1,5,5,7} } 数组字段声明为整数[] 我需要生成一个得分列,对所有这些字段进行汇总。到目前为止,我已经尝试: ALTER TABLE scores DROP IF EXISTS score; ALTER TABLE scores add COLUMN total_sco

我有一个表,它有两个整数列和两个整数数组列,其中保存着分数。例如,我的行如下所示:

{
physical_ed: 40,
music: 90,
first_term: {10,23,43},
second_term: {1,5,5,7}
}
数组字段声明为整数[]

我需要生成一个得分列,对所有这些字段进行汇总。到目前为止,我已经尝试:

ALTER TABLE scores DROP IF EXISTS score;
ALTER TABLE scores add COLUMN total_score integer GENERATED ALWAYS AS (physical_ed::integer + 
first_term[3]::integer + second_term[1]::integer + second_term[2]::integer + second_term[3]::integer) 
STORED;
上面提到的问题是,它没有考虑数组中不同的值,但有时该字段可能有5个不同的值,而不是3个

我已尝试运行select语句,我可以计算select语句中每个数组的总和,通常如下所示:

SELECT *, (SELECT SUM(s) FROM UNNEST(first_term) s) as total_first_term from scores;

不幸的是,这在生成的列查询中不起作用,我们确实需要它成为生成的总分总和的一部分。

首先创建一个函数,对数组的元素求和

create or replace 
function array_sum (the_array integer[])
  returns integer
  language sql 
  immutable 
as $$
    select sum(a_element)::integer from (select unnest(the_array) a_element) u;
$$;
然后调用该函数来帮助计算您的总分列。(假设您的表已经存在)然后:

或者,您可以在调用函数之前连接数组:

alter table scores 
      add column total_score integer 
      generated always as 
      (physical_ed + array_sum(first_term || second_term)) 
      stored; 
我倾向于选择第一个,因为我认为它更清楚地表明了我的意图。但这不是一个强烈的偏好。两者产生相同的结果。见:

alter table scores 
      add column total_score integer 
      generated always as 
      (physical_ed + array_sum(first_term || second_term)) 
      stored;