如何将postgresql JSONB列转换为数组列
表中有一列存储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), (
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
都是来自组合类型的intAS(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
是一个集合返回函数,字符是横向交叉联接
的快捷方式(如果是表联接,它将是一个简单的交叉联接
):