【问题标题】:output 2d array from function as rows and columns从函数输出二维数组作为行和列
【发布时间】:2016-09-24 20:36:12
【问题描述】:

我正在开发一个函数,在该函数中创建一个二维数组,类似于...

{{1, 'John', 'Smith'}, {1, 'Jane', 'Doe'}, {3, 'Tony', 'Stark'}}

我正在构建的函数结合了来自几个不同查询的数据,尽管它看起来似乎没有必要,但这是迄今为止我似乎可以结合我的数据的唯一方法。

我遇到的问题是将数组显示为表格。

我这样调用我的函数:

SELECT * FROM my_func();

^^ 并从上面获取数组输出。 ^^

我希望能够返回如下内容:- 如果我可以标记列,那就更好了。

Col1   | Col2   | Col3
1      | John   | Smith
2      | Jane   | Doe
3      | Tony   | Stark

我试过:SELECT * FROM my_func(); 更好,但仍然无法使用,因为它将所有内容都放在一个列中。

Col1
1
John
Smith
2
Jane
Doe
3
Tony
Stark

【问题讨论】:

    标签: sql postgresql plpgsql


    【解决方案1】:

    问题中缺少信息,因此假设您要返回三列 (int, text, text)。还假设当前的 Postgres 9.5。

    普通 SQL

    LATERAL 加入中使用generate_subscripts()

    WITH t(a) AS (
       SELECT '{{1, John, Smith}, {1, Jane, Doe}, {3, Tony, Stark}}'::text[]
       )
    SELECT t.a[i][1]::int AS col1, t.a[i][2] AS col2, t.a[i][3] AS col3
    FROM t, generate_subscripts(t.a, 1) i;
    

    相关:

    PL/pgSQL

    循环使用FOREACH target [ SLICE number ] IN ARRAY expression:

    CREATE OR REPLACE FUNCTION my_func(_arr text[])
      RETURNS TABLE (col1 int, col2 text, col3 text) AS
    $func$
    DECLARE
       m   text[];
    BEGIN
       FOREACH m SLICE 1 IN ARRAY _arr
       LOOP
          RETURN QUERY SELECT m[1]::int, m[2], m[3];
       END LOOP;
    END
    $func$ LANGUAGE plpgsql;
    

    呼叫:

    WITH t(a) AS (
       SELECT '{{1, John, Smith}, {1, Jane, Doe}, {3, Tony, Stark}}'::text[]
       )
    SELECT f.*
    FROM   t, my_func(t.a) f;
    

    相关:


    每个回报:

     col1 | col2 | col3
    ------+------+-------
        1 | John | Smith
        1 | Jane | Doe
        3 | Tony | Stark
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多