PostgreSQL:使用最大值联接2个数组
我有一个有2条记录的表(说明性目的) 我想选择这两个值并将它们合并在一起PostgreSQL:使用最大值联接2个数组,sql,postgresql,Sql,Postgresql,我有一个有2条记录的表(说明性目的) 我想选择这两个值并将它们合并在一起 要获得在这种情况下生成结果的最高值,请执行以下操作: {1,1,0} 访问数组可以增加到200多个值,因此我希望避免在编程代码(golang)中这样做 基本上与这个问题相同:但在我的例子中,分离的列被合并到一个带有数组的字段中 更新 行(访问)数组的值总是相同的 尝试此查询(): 二进制数组 如果数组仅包含“0”和“1”,并且具有相同数量的值: create table merge_binary_test (id in
要获得在这种情况下生成结果的最高值,请执行以下操作:
{1,1,0}
访问数组可以增加到200多个值,因此我希望避免在编程代码(golang)中这样做
基本上与这个问题相同:但在我的例子中,分离的列被合并到一个带有数组的字段中
更新行(访问)
数组的值总是相同的二进制数组 如果数组仅包含“0”和“1”,并且具有相同数量的值:
create table merge_binary_test (id int, access int[]);
insert into merge_binary_test values
(1, '{0,1,0,1}'),
(2, '{1,0,0,1}');
select string_to_array(bit_or(elem)::text, null)::int[]
from (
select id, array_to_string(access, '')::varbit elem
from merge_binary_test
where id in (1,2)
) sub
string_to_array
-----------------
{1,1,0,1}
(1 row)
以以下为例:
create table arr(id int,access int[]);
insert into arr values (1,'{0,1,0}'),(2,'{0,1,0}'),(3,'{0,0,9}');
因此,这些行将:
id access
-- -------
1 {0,1,0}
2 {0,1,0}
3 {0,0,9}
现在可以创建一个函数来合并数组行,如下所示:
CREATE
OR replace FUNCTION merge_array (
arrval INT -- the total number of values in an array in my example its 3, but 200 is for yours
,tbl TEXT --name of the table in which you want perform this function,
,col TEXT -- name of the array col
)
RETURNS setof INTEGER [] AS $$
DECLARE qry TEXT;
BEGIN
SELECT format('select translate(string_to_array(x.*::text,'','')::text,''()'','''')::int[] from (select %s from (select ' || col || ' ar from ' || tbl || ' ) as sq) as x ', egn)
INTO qry
FROM (
SELECT string_agg('max(ar[' || val || '])', ',') egn
FROM (
SELECT generate_series(1, arrval) val
) t
) tt;
RETURN QUERY
EXECUTE (qry);
END;$$
LANGUAGE plpgsql
用法:选择合并数组(3,'arr','access')
结果:
是,每行(访问)
具有相同数量的值
id access
-- -------
1 {0,1,0}
2 {0,1,0}
3 {0,0,9}
CREATE
OR replace FUNCTION merge_array (
arrval INT -- the total number of values in an array in my example its 3, but 200 is for yours
,tbl TEXT --name of the table in which you want perform this function,
,col TEXT -- name of the array col
)
RETURNS setof INTEGER [] AS $$
DECLARE qry TEXT;
BEGIN
SELECT format('select translate(string_to_array(x.*::text,'','')::text,''()'','''')::int[] from (select %s from (select ' || col || ' ar from ' || tbl || ' ) as sq) as x ', egn)
INTO qry
FROM (
SELECT string_agg('max(ar[' || val || '])', ',') egn
FROM (
SELECT generate_series(1, arrval) val
) t
) tt;
RETURN QUERY
EXECUTE (qry);
END;$$
LANGUAGE plpgsql
merge_array
-----------
{0,1,9}