从函数输出2d数组作为行和列

时间:2016-05-26 17:37:39

标签: sql postgresql plpgsql

我正在开发一个函数,我在这个函数中创建了一个二维数组......

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

1 个答案:

答案 0 :(得分: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