sql - PL/pgSQL 中的动态多维数组

标签 sql postgresql multidimensional-array

我想在 PL/pgSQL 中创建二维数组。

我找到了这样的例子: myarray1 INT[2][2]:=array[[NULL,NULL],[NULL,NULL]];

但在我的例子中,当我创建表时我不知道表的数组,因为数据是从选择查询中读取的。我如何声明动态数组?


我换个方式问。 在 Oracle 中我可以声明:

CREATE OR REPLACE TYPE MY_TYPE AS OBJECT
(
  var1 VARCHAR(20),
  ...
)
...

这对应RECORD是plpsql。

然后在 Oracle 中我可以声明

CREATE OR REPLACE TYPE MY_TYPE_MY_TYPES IS
table of MY_TYPE;

所以我可以将选择查询的结果存储在类型的类型中,这只是二维表。而且我不必知道选择查询返回的行数。

我如何在 plpsql 中完成此操作?

谢谢

最佳答案

在 PostgreSQL 中,所有类型(包括用户定义的类型)都有各自的数组类型。

所以如果你声明了一个复合类型,你也会有一个数组类型。您可以在此处找到有关复合类型的信息:https://www.postgresql.org/docs/current/static/rowtypes.html

举个例子:

1) 创建一个新的复合类型

CREATE TYPE "myType" AS ( "id" INT, "name" VARCHAR );

2) 演示数组表示。结果的类型是“myType”[]

SELECT
    ARRAY_AGG( v::"myType" ) AS v
FROM
    ( VALUES ( 1, 'a' ), ( 2, 'b' ), ( 3, 'c' ), ( 4, 'd' ) ) AS v

result is: {"(1,a)","(2,b)","(3,c)","(4,d)"}

3) 取消嵌套“myType”[] 数组并作为记录返回

SELECT ( UNNEST( '{"(1,a)","(2,b)","(3,c)","(4,d)"}'::"myType"[] ) ).*

result is:

id | name
---|-----
 1 | a
 2 | b
 3 | c
 4 | d

关于sql - PL/pgSQL 中的动态多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5517418/

相关文章:

sql - PostgreSQL:大对象的权限被拒绝

sql - 选择 postgresql 进行组合

c - 指向多维数组的指针

sql - 为什么 NHibernate 生成的参数化 SQL 和存储过程一样快?

mysql - HQL:计算集合中的空值

sql - 基于 Geo 参数查询的最佳方法是什么

ruby-on-rails - 使用 Rails 在简单日历上排序约会的高效 Postgresql 查询

java - Java中为二维数组赋值

python - 遍历二维 python 列表

sql - 为什么我的查询在有索引时进行聚簇索引扫描