PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

postgres array_agg ГРЕШКА:не може да натрупва масиви с различна размерност

Примерни данни:

create table my_table(name text, numbers text[], letters text[]);
insert into my_table values
    ('first',  '{1, 2}', '{a}'   ),
    ('first',  '{2, 3}', '{a, b}'),
    ('second', '{4}',    '{c, d}'),
    ('second', '{5, 6}', '{c}'   );

Трябва да агрегирате елементи от масиви, а не масиви. Използвайте unnest() :

select 
    name, 
    array_agg(distinct number) as numbers, 
    array_agg(distinct letter) as letters
from 
    my_table, 
    unnest(numbers) as number, 
    unnest(letters) as letter
group by name;

  name  | numbers | letters 
--------+---------+---------
 first  | {1,2,3} | {a,b}
 second | {4,5,6} | {c,d}
(2 rows)    

Като алтернатива можете да създадете персонализиран агрегат. Имате нужда от функция за обединяване на масиви (конкатенация с премахване на дубликати):

create or replace function public.array_merge(arr1 anyarray, arr2 anyarray)
    returns anyarray language sql immutable
as $$
    select array_agg(distinct elem order by elem)
    from (
        select unnest(arr1) elem 
        union
        select unnest(arr2)
    ) s
$$;

create aggregate array_merge_agg(anyarray) (
    sfunc = array_merge,
    stype = anyarray
);

select 
    name, 
    array_merge_agg(numbers) as numbers, 
    array_merge_agg(letters) as letters
from my_table
group by name;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Играйте 2.2 с Hibernate JPA и Postgres

  2. PostgreSQL Connection Pooling:Част 3 – Pgpool-II

  3. 7 начина да намерите дублиращи се редове в PostgreSQL, като игнорирате първичния ключ

  4. Как да покажа функцията, процедурата, задейства изходния код в postgresql?

  5. използвайте try/освен с psycopg2 или със затваряне?