【问题标题】:dereferencing postgres 2d array取消引用 postgres 二维数组
【发布时间】:2013-02-08 06:04:08
【问题描述】:

所以我注意到当您取消引用只有一维的二维数组时,postgres (9.0) 不喜欢它。这是一个有趣的例子

WITH my_table(arr) AS ( VALUES (ARRAY[[10,11],[20,21]]) )
SELECT arr[2][1] AS good, arr[1] AS bad FROM my_table;

 good | bad
------+-----
   20 |
(1 row)

如您所见,当您不指定第二个维度时,它会返回 null。理想情况下,我希望它返回内部数组{10,11}。所以为了解决这个问题,我写了这个函数

CREATE OR REPLACE FUNCTION deref_2d(orig_arr numeric[][], inner_arr int)
RETURNS numeric[] AS $$
DECLARE
  index int;
  len int;
  return_arr numeric[];
BEGIN
  len := array_upper(orig_arr,2);
  FOR index IN 1 .. len LOOP
    return_arr[index] := orig_arr[inner_arr][index];
  END LOOP;
  RETURN return_arr;
END
$$ LANGUAGE plpgsql;

现在我可以写了:

WITH my_table(arr) AS ( VALUES (ARRAY[[10,11],[20,21]]) )
SELECT deref_2d(arr,1) FROM my_table;
 deref_2d
----------
 {10,11}

但是与此相关的很多事情让我对我的解决方案感到不安。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: arrays postgresql


    【解决方案1】:

    在你注销之前考虑一下这部西部片的完整演员阵容:

    WITH tbl(arr) AS (SELECT (ARRAY[[10,11],[20,21]]))
    SELECT arr[2][1]    AS the_good
          ,arr[1]       AS the_bad
          ,arr[1:1]     AS the_ugly   -- first slice of 2D-array
          ,arr[1][1:2]  AS the_ugly_twin -- 2D-array with elements 1 & 2 of 1st slice
          ,ARRAY((SELECT unnest(arr[1:1]))) AS the_righteous -- 1D-array of 1st slice
    FROM   tbl;
    

    ->sqlfiddle 有更多示例。

    手册herehere 的一些背景知识。

    【讨论】:

    • 阵列切片 FTW!感谢您向我展示此语法。这是在哪里记录的?我只能找到大多数 postgres 细微差别的小例子(像这样)。
    • @wesdotcool:在过去 12 年中,我一直在使用 Postgres,学到了一些技巧。添加了手册的链接。
    猜你喜欢
    • 2021-09-07
    • 2018-09-25
    • 2021-11-18
    • 2015-09-30
    • 2021-03-27
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多