Postgres C 扩展数据类型定义

问题描述

在处理以下问题时,Postgres 处理更复杂的结构有点棘手。我想建立一个二维结构数组,但不知道如何让Postgres C支持我这样做?有人有什么想法吗?

Table
    id     contents(text)              num(double)
    1       I love you.            {1,3,4,5,6,7,8,10}
    2       why do it?             {3,2,11,12,33,44,15}
    3       stopping.              {22,15,14,22,55}
    4       try it again.          {15,55,21,31,11}

对数组每个位置的行进行排序,得到如下结构。下面第一行的结果是num字段列数组的第一个位置,以此类推。count 4是指返回第n个排序。

select my_func(contents,num,4) from table;

预期结果:

                           result
{('stopping.',22),('try it again.',15),('why do it?',3),('I love you.',1)}
{('stopping.',33),12),4),3)}
{('stopping.',11),2)}
......
......

提前致谢。

解决方法

我不确定您为什么需要 C 扩展数据类型,但以下内容将提供您想要的并且可以作为 plpgsql 函数实现的内容。

WITH t1 AS (
  SELECT id,contents,unnest (num) AS n FROM table
),t2 AS (
  SELECT id,n,row_number () OVER (PARTITION BY id ORDER BY id) AS o
         FROM t1 ORDER BY o ASC,n DESC,id ASC
),t3 AS (
  SELECT array_agg (ROW (contents,n)) AS a,o
         FROM t2 GROUP BY o ORDER BY o
)
SELECT array_agg (a ORDER BY o) FROM t3;

更新:上述问题可能是未定义的“unnest”顺序。 下面给出了 index 和 num 的一致关系,但需要明确写出 num 数组的大小。

WITH RECURSIVE t1 (i,id,num) AS (
  SELECT 1,num[1] FROM table
  UNION ALL
  SELECT t1.i + 1,table.id,table.contents,table.num[t1.i + 1]
         FROM t1,table
         WHERE t1.id = table.id AND t1.i < 8 -- put here size of array
),t2 (i,d) AS (
  SELECT i,array_agg (ROW (contents,num) ORDER BY num DESC)
         FROM t1 GROUP BY i
)
SELECT array_agg (d ORDER BY i) FROM t2;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...