【问题标题】:unwrap postgresql array into rows将 postgresql 数组解包成行
【发布时间】:2011-11-10 16:40:05
【问题描述】:

在 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;
$$

有没有更好的办法?

【问题讨论】:

    标签: sql arrays postgresql


    【解决方案1】:

    使用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;
    

    【讨论】:

      【解决方案2】:

      unnest --> 将数组扩展为一组行

      unnest(ARRAY[1,2])
      1
      2
      

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

      【讨论】:

      【解决方案3】:

      如果你有一张桌子users_to_articles 喜欢:

      user_id articles
      1 {1,2}
      2 {6,2,7}

      并且需要将articles数组爆破才能得到:

      user_id  article_id
      1 1
      1 2
      2 6
      2 2
      2 7

      你可以这样运行:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-02
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多