【问题标题】:Selecting data into a Postgres array将数据选择到 Postgres 数组中
【发布时间】:2012-07-30 12:50:38
【问题描述】:

我有以下数据:

name          id             url

John          1              someurl.com
Matt          2              cool.com
Sam           3              stackoverflow.com

如何在 Postgres 中编写 SQL 语句,将这些数据选择成多维数组,即:

{{John, 1, someurl.com}, {Matt, 2, cool.com}, {Sam, 3, stackoverflow.com}}

我之前在 Postgres 中看到过这种数组用法,但不知道如何从表中选择数据到这种数组格式。

这里假设所有列的类型都是text

【问题讨论】:

    标签: sql arrays postgresql aggregate-functions


    【解决方案1】:

    您需要使用aggregate functionarray_agg 应该做你需要的。

    SELECT array_agg(s) FROM (SELECT name, id, url FROM the_table ORDER BY id) AS s;
    

    【讨论】:

    • 这个答案返回的是记录数组,而不是多维数组。
    • 是的 - 刚刚开始在上下文中工作,你是对的......我真的需要多维数组!
    • @MattW:我认为你可以得到帮助。 :) 发布了答案。
    【解决方案2】:

    您不能使用array_agg() 来生成多维数组,至少不能达到 PostgreSQL 9.4。
    (但即将推出的 Postgres 9.5 提供了一个 new variant of array_agg() 可以!)

    您从@Matt Ball's query 得到的是一组记录 (the_table[])。

    数组只能包含相同基本类型的元素。你显然有数字和字符串类型。将所有列(尚未)转换为 text 以使其工作。

    您可以为此创建一个聚合函数,就像我之前向您展示的 here 一样。

    CREATE AGGREGATE array_agg_mult (anyarray)  (
        SFUNC     = array_cat
       ,STYPE     = anyarray
       ,INITCOND  = '{}'
    );
    

    呼叫:

    SELECT array_agg_mult(ARRAY[ARRAY[name, id::text, url]]) AS tbl_mult_arr
    FROM   tbl;
    

    注意额外的ARRAY[] 层,使其成为多维数组(准确地说是二维)。

    即时演示:

    WITH tbl(id, txt) AS (
        VALUES
          (1::int, 'foo'::text)
         ,(2,      'bar')
         ,(3,      '}b",') -- txt has meta-characters
        )
        , x AS (
        SELECT array_agg_mult(ARRAY[ARRAY[id::text,txt]]) AS t
        FROM   tbl
        )
    SELECT *, t[1][3] AS arr_element_1_1, t[3][4] AS arr_element_3_2
    FROM   x;
    

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多