PostgreSQL:使用最大值联接2个数组

PostgreSQL:使用最大值联接2个数组,sql,postgresql,Sql,Postgresql,我有一个有2条记录的表(说明性目的) 我想选择这两个值并将它们合并在一起 要获得在这种情况下生成结果的最高值,请执行以下操作: {1,1,0} 访问数组可以增加到200多个值,因此我希望避免在编程代码(golang)中这样做 基本上与这个问题相同:但在我的例子中,分离的列被合并到一个带有数组的字段中 更新 行(访问)数组的值总是相同的 尝试此查询(): 二进制数组 如果数组仅包含“0”和“1”,并且具有相同数量的值: create table merge_binary_test (id in

我有一个有2条记录的表(说明性目的)

我想选择这两个值并将它们合并在一起
要获得在这种情况下生成结果的最高值,请执行以下操作:

{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}