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

array_agg за Типове масиви

Можете да напишете персонализиран агрегат, който да обработва вашия специфичен масив от масиви, напр.:

DROP TABLE IF EXISTS e;
CREATE TABLE e
(
    id serial PRIMARY KEY,
    alert_type text,
    date_happened timestamp with time zone
);

INSERT INTO e(alert_type, date_happened) VALUES
    ('red', '2011-05-10 10:15:06'),
    ('yellow', '2011-06-22 20:01:19');

CREATE OR REPLACE FUNCTION array_agg_custom_cut(anyarray)
RETURNS anyarray
    AS 'SELECT $1[2:array_length($1, 1)]'
LANGUAGE SQL IMMUTABLE;

DROP AGGREGATE IF EXISTS array_agg_custom(anyarray);
CREATE AGGREGATE array_agg_custom(anyarray)
(
    SFUNC = array_cat,
    STYPE = anyarray,
    FINALFUNC = array_agg_custom_cut,
    INITCOND = $${{'', '', ''}}$$
);

Запитване:

SELECT
    array_agg_custom(
        ARRAY[
            alert_type::text,
            id::text,
            CAST(extract(epoch FROM date_happened) AS text)
        ])
FROM e;

Резултат:

              array_agg_custom              
--------------------------------------------
 {{red,1,1305036906},{yellow,2,1308787279}}
(1 row)

РЕДАКТИРАНЕ:

Ето втория, по-кратък начин (тоест, нямате нужда от array_agg_custom_cut функция, но както виждате допълнителен ARRAY ниво е необходимо в заявката):

CREATE AGGREGATE array_agg_custom(anyarray)
(
    SFUNC = array_cat,
    STYPE = anyarray
);

SELECT
    array_agg_custom(
        ARRAY[
            ARRAY[
                alert_type::text,
                id::text,
                CAST(extract(epoch FROM date_happened) AS text)
            ]
        ])
FROM e;

Резултат:

              array_agg_custom              
--------------------------------------------
 {{red,1,1305036906},{yellow,2,1308787279}}
(1 row)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_dump postgres база данни от отдалечен сървър, когато порт 5432 е блокиран

  2. Автоматизиране на ежедневните задачи на PostgreSQL с помощта на Jenkins

  3. Как мога да използвам UUID в SQLAlchemy?

  4. PostgreSQL поддържа ли прозрачно компресиране на таблици (фрагменти)?

  5. java.lang.NoSuchFieldError:NONE в хибернация с Spring 3, maven, JPA, c3p0