在 PostgreSQL 中将数组展开为行

发布于 2024-12-03 01:23:21 字数 468 浏览 1 评论 0原文

在 PostgreSQL 中将数组展开为行的最快方法是什么?例如,

我们有:

a
-
{1,2}
{2,3,4}

我们需要:

b
- 
1
2
2
3
4

我正在使用:

select explode_array(a) as a from a_table;

其中explode_array是:

create or replace function explode_array(in_array anyarray) returns setof anyelement as
$$
    select ($1)[s] from generate_series(1,array_upper($1, 1)) as s;
$$

有没有更好的方法?

What is the fastest way to unwrap array into rows in PostgreSQL? For instance,

We have:

a
-
{1,2}
{2,3,4}

And we need:

b
- 
1
2
2
3
4

I'm using:

select explode_array(a) as a from a_table;

where explode_array is:

create or replace function explode_array(in_array anyarray) returns setof anyelement as
$
    select ($1)[s] from generate_series(1,array_upper($1, 1)) as s;
$

Is there any better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

通知家属抬走 2024-12-10 01:23:21

使用unnest。例如:

CREATE OR REPLACE FUNCTION test( p_test text[] )
  RETURNS void AS
$BODY$
BEGIN
  SELECT id FROM unnest( p_test ) AS id;
END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE
  COST 1;

Use unnest. For example:

CREATE OR REPLACE FUNCTION test( p_test text[] )
  RETURNS void AS
$BODY$
BEGIN
  SELECT id FROM unnest( p_test ) AS id;
END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE
  COST 1;
笑脸一如从前 2024-12-10 01:23:21

解除嵌套 -->将数组展开为一组行

unnest(ARRAY[1,2])
1
2

http://www.sqlfiddle.com/#!1 /c774a/24

unnest --> expand an array to a set of rows

unnest(ARRAY[1,2])
1
2

http://www.sqlfiddle.com/#!1/c774a/24

别忘他 2024-12-10 01:23:21

如果您有一个表users_to_articles,例如:

user_idposts
1{1,2}
2{6,2,7}

并且需要分解articles数组以获得:

user_id article_id
11
12
26
22
27

你可以运行类似的东西:

CREATE TABLE "users_to_articles" (
  "user_id" SERIAL PRIMARY KEY,
  "articles" INT[]
);

INSERT INTO "users_to_articles" ("articles")
VALUES ('{1,2}'), ('{6,2,7}');

SELECT
  "user_id"
, "article_id"
FROM "users_to_articles", unnest("articles") AS "article_id";

这是一个工作的sqlfiddle:
http://www.sqlfiddle.com/#!17/c26742/1

If you have a table users_to_articles like:

user_idarticles
1{1,2}
2{6,2,7}

And need to explode the articles array so to obtain:

user_id article_id
11
12
26
22
27

You could run something like that:

CREATE TABLE "users_to_articles" (
  "user_id" SERIAL PRIMARY KEY,
  "articles" INT[]
);

INSERT INTO "users_to_articles" ("articles")
VALUES ('{1,2}'), ('{6,2,7}');

SELECT
  "user_id"
, "article_id"
FROM "users_to_articles", unnest("articles") AS "article_id";

Here is a working sqlfiddle:
http://www.sqlfiddle.com/#!17/c26742/1

孤者何惧 2024-12-10 01:23:21

您可以使用 unnest() 将数组解包为一组行。

例如,您可以将 INT[] 类型的数组解包为一组行,如下所示:

postgres=# SELECT unnest(ARRAY[1,2,3]::INT[]);
 unnest
--------
      1
      2
      3
(3 rows)

*备注:

  • 解包值的类型为 INT( 整数)。

  • 你可以省略::INT[],那么解包值的类型仍然是INT(INTEGER)。

并且,您可以将 VARCHAR[] 类型的数组解包为一组行,如下所示:

postgres=# SELECT unnest(ARRAY['John','David','Robert']::VARCHAR[]);
 unnest
--------
 John
 David
 Robert
(3 rows)

*备注:

  • 解包值的类型为 VARCHAR(<代码>字符变化)。

  • 您可以省略::VARCHAR[],则解包值的类型为TEXT

并且,您可以将 RECORD[] 类型的数组解包为一组行,如下所示:

postgres=# SELECT unnest(ARRAY[ROW('John','Smith'),ROW('David','Miller')]);
     unnest
----------------
 (John,Smith)
 (David,Miller)
(2 rows)

*备注:

  • 解包值的类型为 RECORD。< /p>

  • 您必须使用ROW()而不是::RECORD[]来创建RECORD[]类型的数组,否则会出现< a href="https://stackoverflow.com/questions/77952634/how-to-create-the-array-of-rows-by-hand-in-postgresql">错误。

You can use unnest() to unwrap an array into a set of rows.

For example, you can unwrap the array of INT[] type into a set of rows as shown below:

postgres=# SELECT unnest(ARRAY[1,2,3]::INT[]);
 unnest
--------
      1
      2
      3
(3 rows)

*Memos:

  • The type of unwrapped values are INT(INTEGER).

  • You can omit ::INT[], then the type of unwrapped values are still INT(INTEGER).

And, you can unwrap the array of VARCHAR[] type into a set of rows as shown below:

postgres=# SELECT unnest(ARRAY['John','David','Robert']::VARCHAR[]);
 unnest
--------
 John
 David
 Robert
(3 rows)

*Memos:

  • The type of unwrapped values are VARCHAR(CHARACTER VARYING).

  • You can omit ::VARCHAR[], then the type of unwrapped values are TEXT.

And, you can unwrap the array of RECORD[] type into a set of rows as shown below:

postgres=# SELECT unnest(ARRAY[ROW('John','Smith'),ROW('David','Miller')]);
     unnest
----------------
 (John,Smith)
 (David,Miller)
(2 rows)

*Memos:

  • The type of unwrapped values are RECORD.

  • You must use ROW() instead of ::RECORD[]to create the array of RECORD[] type otherwise there is the error.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文