Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将postgresql JSONB列转换为数组列_Postgresql - Fatal编程技术网

如何将postgresql JSONB列转换为数组列

如何将postgresql JSONB列转换为数组列,postgresql,Postgresql,表中有一列存储jsonb中的多边形点 position --------------- [{"x": 455, "y": -3165},{"x": 455,"y": 50}, {"x": 5708,"y": 50}] 我想将jsonb转换为数组,如下所示: position_array ----------------- ((455, -3165),(455, 50), (

表中有一列存储jsonb中的多边形点

position
---------------
[{"x": 455, "y": -3165},{"x": 455,"y": 50},  {"x": 5708,"y": 50}]
我想将jsonb转换为数组,如下所示:

position_array
-----------------
((455, -3165),(455, 50), (5708, 50))

我想不出一个简单的方法来做这件事。请帮助您应该使用
jsonb\u to\u记录集(jsonb)
功能,从

引用文件:

将顶级JSON对象数组扩展为一组具有AS子句定义的复合类型的行

在这种情况下,我们需要将
jsonb_to_记录集
应用于实际的jsonb本身。这将允许postgres将您的jsonb数组视为遵循复合类型定义的一组行,在您的案例中,复合类型定义由
as(x int,y int)
定义。这告诉postgres,一旦完成了将
jsonb
转换为记录集,它应该取出
jsonb
中的
x
y
键,并将它们作为整数处理

看起来是这样的(我只是在这里复制并粘贴了您的原始jsonb):

如果您运行:

SELECT * FROM jsonb_to_recordset('[{"x": 455, "y": -3165},{"x": 455,"y": 50},  {"x": 5708,"y": 50}]') AS (x int, y int);
您将看到它为您提供了3行,其中包含
x
y
列,其中包含
jsonb
中每个对象的预期值

接下来,您需要使用
array\u agg
将其转换为最终所需的数组。但是,您需要指定要聚合的实际上是
array[x,y]
——这将有效地聚合具有形状
{x,y}
的数组,其中
x
y
都是来自组合类型
AS(x int,y int)

将所有这些放在一起,这将为您提供所需的结果:

SELECT array_agg(array[x, y]) as position_array FROM jsonb_to_recordset('[{"x": 455, "y": -3165},{"x": 455,"y": 50},  {"x": 5708,"y": 50}]') AS (x int, y int);
输出:

{{455,-3165},{455,50},{5708,50}


请注意:在Postgres中,数组是用
{
定义的,而不是
:)

您应该使用
jsonb\u to\u记录集(jsonb)
函数,从

引用文件:

将顶级JSON对象数组扩展为一组具有AS子句定义的复合类型的行

在这种情况下,我们需要将
jsonb_to_记录集
应用于实际的jsonb本身。这将允许postgres将您的jsonb数组视为遵循复合类型定义的一组行,由
as(x int,y int)定义
在您的情况下。这告诉postgres,一旦完成将
jsonb
转换为记录集,它应该取出
jsonb
中的
x
y
键,并将它们作为整数处理

看起来是这样的(我只是在这里复制并粘贴了您的原始jsonb):

如果您运行:

SELECT * FROM jsonb_to_recordset('[{"x": 455, "y": -3165},{"x": 455,"y": 50},  {"x": 5708,"y": 50}]') AS (x int, y int);
您将看到它为您提供了3行,其中包含
x
y
列,其中包含
jsonb
中每个对象的预期值

接下来,您需要使用
array\u agg
将其转换为最终所需的数组。但是,您需要指定要聚合的实际上是
array[x,y]
——这将有效地聚合具有形状
{x,y}的数组
,其中
x
y
都是来自组合类型的int
AS(x int,y int)

将所有这些放在一起,这将为您提供所需的结果:

SELECT array_agg(array[x, y]) as position_array FROM jsonb_to_recordset('[{"x": 455, "y": -3165},{"x": 455,"y": 50},  {"x": 5708,"y": 50}]') AS (x int, y int);
输出:

{{455,-3165},{455,50},{5708,50}

请注意:在Postgres中,数组是用
{
定义的,而不是
:)

  • 将所有数组元素提取到每个元素的一行中
  • 获取
    x
    /
    y
  • x
    /
    y
    聚合到一个数组中
  • 将这些数组聚合为一个全局数组
  • 将所有数组元素提取到每个元素的一行中
  • 获取
    x
    /
    y
  • x
    /
    y
    聚合到一个数组中
  • 将这些数组聚合为一个全局数组

  • 第二个值的具体类型是什么?第二个值的具体类型是什么?与使用复合类型的jsonb_to_记录集相比,使用jsonb_数组_元素的优势是什么?虽然我认为这是一个正确的答案,但我不太明白“来自t,jsonb_数组_元素(数据)”'部分,这看起来是一个表连接?@georgehu,因为
    jsonb\u array\u elements
    是一个集合返回函数,字符是
    横向交叉连接
    的快捷方式(如果它是一个表连接,它将是一个简单的
    交叉连接
    ):与使用复合类型的jsonb_to_记录集相比,使用jsonb_数组_元素有什么好处?虽然我认为这是一个正确的答案,但我并不完全理解“来自t,jsonb_数组_元素(数据)”的意思'部分,这看起来是一个表联接?@georgehu,因为
    jsonb_array_elements
    是一个集合返回函数,字符是
    横向交叉联接
    的快捷方式(如果是表联接,它将是一个简单的
    交叉联接
    ):