首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Postgres如何将json数组解压到列中,然后重新打包,但保留数据类型?

PostgreSQL是一种开源的关系型数据库管理系统,支持广泛的数据类型和功能。它提供了丰富的功能来处理JSON数据类型,包括将JSON数组解压到列中,并保留数据类型。

要将JSON数组解压到列中,可以使用PostgreSQL的内置函数json_array_elements。该函数将JSON数组作为输入,并将其拆分为多行,每行包含数组中的一个元素。然后,可以使用这些元素创建新的列。

以下是一个示例,展示了如何将JSON数组解压到列中,并保留数据类型:

代码语言:txt
复制
-- 创建一个包含JSON数组的表
CREATE TABLE my_table (
  id SERIAL PRIMARY KEY,
  json_array JSON
);

-- 插入示例数据
INSERT INTO my_table (json_array) VALUES
  ('[1, 2, 3]'),
  ('["foo", "bar", "baz"]'),
  ('[{"name": "John", "age": 30}, {"name": "Jane", "age": 25}]');

-- 使用json_array_elements函数解压JSON数组到列中
SELECT id, json_array_elements(json_array) AS value
FROM my_table;

-- 输出结果:
-- id | value
-- ---+-------
-- 1  | 1
-- 1  | 2
-- 1  | 3
-- 2  | "foo"
-- 2  | "bar"
-- 2  | "baz"
-- 3  | {"name": "John", "age": 30}
-- 3  | {"name": "Jane", "age": 25}

-- 创建新的列来保存解压后的值
ALTER TABLE my_table ADD COLUMN value_type TEXT;
ALTER TABLE my_table ADD COLUMN value_int INTEGER;
ALTER TABLE my_table ADD COLUMN value_text TEXT;
ALTER TABLE my_table ADD COLUMN value_json JSON;

-- 更新新列的值
UPDATE my_table SET
  value_type = json_typeof(value),
  value_int = (value::text::integer),
  value_text = (value::text),
  value_json = (value::json)
FROM (
  SELECT id, json_array_elements(json_array) AS value
  FROM my_table
) AS subquery
WHERE my_table.id = subquery.id;

-- 打包数据并保留数据类型
SELECT id, json_agg(json_build_object(
  'value_type', value_type,
  'value_int', value_int,
  'value_text', value_text,
  'value_json', value_json
)) AS json_array
FROM my_table
GROUP BY id;

-- 输出结果:
-- id | json_array
-- ---+--------------------------------------------------
-- 1  | [{"value_type": "number", "value_int": 1, "value_text": "1", "value_json": 1},
--     |  {"value_type": "number", "value_int": 2, "value_text": "2", "value_json": 2},
--     |  {"value_type": "number", "value_int": 3, "value_text": "3", "value_json": 3}]
-- 2  | [{"value_type": "string", "value_int": null, "value_text": "foo", "value_json": "foo"},
--     |  {"value_type": "string", "value_int": null, "value_text": "bar", "value_json": "bar"},
--     |  {"value_type": "string", "value_int": null, "value_text": "baz", "value_json": "baz"}]
-- 3  | [{"value_type": "object", "value_int": null, "value_text": "{\"name\": \"John\", \"age\": 30}", "value_json": {"name": "John", "age": 30}},
--     |  {"value_type": "object", "value_int": null, "value_text": "{\"name\": \"Jane\", \"age\": 25}", "value_json": {"name": "Jane", "age": 25}}]

在上述示例中,我们首先创建了一个包含JSON数组的表,并插入了一些示例数据。然后,使用json_array_elements函数将JSON数组解压到多行中。接下来,我们创建了新的列来保存解压后的值,并使用UPDATE语句将值更新到新列中。最后,使用json_agg和json_build_object函数将数据重新打包为JSON数组,并保留了原始数据类型。

对于PostgreSQL的云计算解决方案,腾讯云提供了云数据库PostgreSQL,它是一种高性能、高可靠性的托管式数据库服务。您可以通过以下链接了解更多关于腾讯云数据库PostgreSQL的信息:腾讯云数据库PostgreSQL

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

超越 REST

这种努力值得称赞,往往需要内部组织之间历经几个季度的协调,然后将所有相关实体开发并集成到一个单一的单体图中。...关于最后一点:更改表的类型将会打破关联的视图,但是通过封装在事务的更改,可以删除视图、更新该然后可以在提交事务之前重新创建视图。...; json— — — — — — — — — — — — -{“hello world”: 1, “2”: 3}(1 row) 在生成的模式数据类型JSONjson 字段的内部结构(hello...为了进一步描述 json 字段的内部结构(将其在生成的模式公开),定义一个复合类型,并创建一个返回该类型的视图: postgres_test_db=# CREATE TYPE postgraphile.custom_type...关于安全性(如何将其与我们的 IAM 基础设施集成,以及如何在数据库实施行级访问控制?)和性能(如何限制查询以避免一次选择所有行来对数据库进行 DDoS 攻击?)

2.9K20

MySQL8和PostgreSQL10功能对比

特征 MySQL8 PostgreSQL10 「查询和分析」 通用表达式(CTEs) ✔ New ✔ 视窗功能 ✔ New ✔ 「数据类型」 支持JSON ✔ Improved ✔ GIS /...在所有应用程序,可能只有不到0.1%会达到这个规模,这是需要牢记的。 聚合索引对比堆(Heap)表 聚合索引是其中行被直接嵌入主键的B树结构内的表结构。...标头后面的项目是一个数组标识符,由(offset, length)指向元组或数据行的对组成。请记住,在Postgres,可以通过这种方式将同一记录的多个版本存储在同一页面。 ?...(MySQL的页面必须至少包含2行,巧合的是16KB / 2 = 8KB) 那么当中有一个大的JSON对象时会发生什么? ? Postgres使用TOAST(专用的影子表存储)。...这种设计可确保在物理设备上保留连续的连续区域,从而提高性能。重做日志越大,性能越好,但要从崩溃恢复时间。 在Postgres添加了新的复制功能后,我称之为平局。

2.7K20
  • 3.Elasticsearch面向文档

    1.面向文档 在应用程序对象很少只是一个简单的键和值的列表。通常,它们拥有更复杂的数据结构,可能包括日期、地理信息、其他对象或者数组等。 也许有一天你想把这些对象存储在数据库。...使用关系型数据库的行和存储,这相当于是把一个表现力丰富的对象挤压到一个非常大的电子表格:你必须将这个对象扁平化来适应表结构–通常一个字段>对应一–而且又不得不在每次查询时重新构造对象。...bastkeyball", "football" ] }, "create_time": "2018-05-01" } 虽然原始的 user 对象很复杂,这个对象的结构和含义在...JSON 版本中都得到了体现和保留。...在 Elasticsearch 中将对象转化为 JSON 并做索引要比在一个扁平的表结构做相同的事情简单的多。 下一篇:4.Elasticsearch索引文档

    59820

    进阶数据库系列(二十五):PostgreSQL 数据库日常运维管理

    这会影响应⽤于字符串的排序顺序,例如在使⽤ORDER BY的查询,以及在⽂本的索引中使⽤的顺序。 默认设置是使⽤模板数据库的排序规则。有关其他限制,请参⻅“注释”部分。...cd /opt wget https://github.com/json-c/json-c/archive/json-c-0.13.1-20180305.tar.gz tar -zxvf json-c...不要以pg开头,不要以数字开头,不要使用保留字; 查询的别名不要使用 “小写字母,下划线,数字” 以外的字符,例如中文; 主键索引应以 pk_ 开头, 唯一索引要以 uk_ 开头,普通索引要以 idx...设计规范 多表的相同,必须保证列名一致,数据类型一致; btree索引字段不建议超过2000字节,如果有超过2000字节的字段需要建索引,建议使用函数索引(例如哈希值索引),或者使用分词索引; 对于频繁更新的表...85,每页预留15%的空间给HOT更新使用;(create table test123(id int, info text) with(fillfactor=85); CREATE TABLE) 表结构字段定义的数据类型与应用程序的定义保持一致

    1.1K20

    MySQL 8.0 JSON增强到底有多强?(一)

    关于MySQL 8.0 JSON数据类型,后面准备通过一个系列的文章来进行详细的介绍,这样方便大家对MySQLJSON数据类型的使用有更好的了解; 很多业务人员在用 JSON 数据类型时会遇到各种各样的问题...当你看完今天的内容之后,会真正认识到 JSON 数据类型的威力,从而在实际工作更好地存储非结构化的数据。...与在字符串列存储JSON格式的字符串相比,JSON数据类型具有以下优势: * 自动验证存储在JSONJSON文档 。无效的文档会产生错误。 * 优化的存储格式。...一、JSON数据类型 存储在JSON的任何JSON文档的大小都限于max_allowed_packet系统变量的值。...JSON_MERGE_PRESERVE()通过组合数组该键的所有唯一值来处理具有相同键的多个对象;然后将此数组用作结果该键的值。

    7.8K21

    MySQL与PostgreSQL对比

    PostgreSQL相对于MySQL的优势 1)不仅仅是关系型数据库 除了存储正常的数据类型外,还支持存储: array,不管是一位数组还是多为数组均支持 json(hStore)和jsonb,相比使用...json存储完的文本,json会每次都解析存储的值,它不支持索引,你可以为查询创建表达式索引。 jsonb存储的二进制格式,避免了重新解析数据结构。...当我们比较写入数据速度时,由于数据存储的方式的原因,jsonb会比json稍微的慢一点。json会每次都解析存储的值,这意味着键的顺序要和输入的时候一样。...FDW提供了一个SQL接口,用于访问远程数据存储的远程大数据对象,使DBA可以整合来自不相关数据源的数据,将它们存入Postgres数据库的一个公共模型。...借助这种方法,用户可以将数据作为行、JSON文档进行查看、排序和分组。他们甚至可以直接从Postgres向源文档数据库写入(插入、更细或删除)数据,就像一个一体的无缝部署。

    9K10

    PostgreSQL JSONB 使用入门

    Photo by Tobias Fischer[9] on Unsplash[10] json 类型 说明 根据RFC 7159[1]的说明,JSON 数据类型是用来存储 JSON(JavaScript...也有很多 JSON 相关的函 数和操作符可以用于存储在这些数据类型的数据 PostgreSQL支持两种 JSON 数据类型json 和 jsonb。它们几乎接受完全相同的值集合作为输入。...json数据类型存储输入文本的精准拷贝,处理函数必须在每 次执行时必须重新解析该数据。而jsonb数据被存储在一种分解好的二进制格式,因为需要做附加的转换,它在输入时要稍慢一些。...如果一个值JSON 对象包含同一个键超过一次,所有的键/值对都会被保留(** 处理函数会把最后的值当作有效值**)。 jsonb不保留空格、不保留对象键的顺序并且不保留重复的对象键。...但是索引将会存储content每一个键 和值的拷贝,表达式索引只存储tags 键下找到的数据。

    8K20

    进阶数据库系列(十二):PostgreSQL 索引技术详解

    索引:目前,只有 B-tree、GiST、GIN 和 BRIN 索引类型支持多索引,最多可以指定32个(该限制可以在源代码文件 pg_config_manual.h 修改,但是修改后需要重新编译...表达式索引:从表的一或多列计算而来的一个函数或者标量表达式。索引表达式的维护代价较为昂贵,因为在每一个行被插入或更新时都得为它重新计算相应的表达式。...INCLUDE:指定一个的列表,其中的将被包括在索引作为非键。不能作为索引扫描的条件,主要作用是相关数据索存储在索引,访问时无需访问该索引的基表。...假设执行了一个查询,该查询包含某的条件;如果所查找的值没有进入区间,则可以跳过整个range;如果它们确实在,所有块的所有行都必须被查看以从中选择匹配的行。...在BRIN索引,PostgreSQL会为每个8k大小的存储数据页面读取所选的最大值和最小值,然后将该信息(页码以及的最小值和最大值)存储到BRIN索引

    2.3K40

    PostgreSQL数据的存储基础知识

    OID 在系统表通常是作为隐藏存在的,它是以整个PostgreSQL数据库实例(Database Cluster)的范围内统一分配。...将无法再使用: CREATE TABLE … WITH OIDS 命令 default_with_oids (boolean) 相容性设定 数据类型OID保留Postgres 12。...由于 OID 是系统表的隐藏,因此查看系统表数据库对象的OID时,必须在SELECT语句中显式指定。...如果第一页空间已经被数据填满,则 postgres 会立刻重新在文件末尾(即已填满页的后面)添加一个新的空白页,用于继续存储数据,一直持续这个过程,直到当前表文件大小达到 1GB位置。...若文件达到1GB,则重新创建一个新的表文件,然后重复上面的这个过程。

    2.3K60

    YAML 快速上手

    使用双引号表示字符串时,会转义字符串的特殊字符(例如\n)。使用单引号时不会转义字符串的特殊字符。 数组的每个元素单独一行,并以 - 开头。或使用方括号,元素用逗号隔开。...,最后的换行符不保留。...linefeed1": "some\ntext", "linefeed2": "some\ntext", "linefeed3": "some\n\ntext" } > 当内容换行时,替换为空格,保留最后一行的换行符...": "some text\n", "linefeed2": "some text\n", "linefeed3": "some\ntext\n" } >+ 当内容换行时,替换为空格,保留最后一行的换行符...这个文件的顶层由七个键值组成:其中一个键值"items",是两个元素构成的数组(或称清单),这数组的两个元素同时也是包含了四个键值的散列表。

    17910

    “王者对战”之 MySQL 8 vs PostgreSQL 10

    特性 MySQL 8 PostgreSQL 10 查询 & 分析 公用表表达式 (CTEs) ✔ New ✔ 窗口函数 ✔ New ✔ 数据类型 JSON 支持 ✔ Improved ✔ GIS...可能只有不到 0.1% 的应用会超出这个范围,这是需要记住的。 聚簇索引 vs 堆表 聚簇索引是一种表结构,其中的行直接嵌入其主键的 b 树结构。...条目后面的项是一个数组标识符,由指向元组或数据行的(偏移、长度)对组成。在 Postgres ,相同记录的多个版本可以以这种方式存储在同一页面。 ?...那么当你在一个中有一个大型 JSON 对象时会发生什么呢? Postgres 使用 TOAST,这是一个专用的影子表(shadow table)存储。当行和被选中时,大型对象就会被拉出。...这种设计保证在物理设备上保留一个连续的连续区域,从而提高性能。 更大的重做日志产生更高的性能,但要以崩溃恢复时间为代价。 随着新的复制功能添加到Postgres,我觉得他们不分伯仲。

    4.1K21

    PostgreSQL 教程

    PostgreSQL 基础教程 首先,您将学习如何使用基本数据查询技术从单个表查询数据,包括查询数据、对结果集进行排序和过滤行。然后,您将了解高级查询,例如连接多个表、使用集合操作以及构造子查询。...主题 描述 将 CSV 文件导入表 向您展示如何将 CSV 文件导入表。 将 PostgreSQL 表导出到 CSV 文件 向您展示如何将表导出到 CSV 文件。...添加 向您展示如何向现有表添加一或多。 删除 演示如何删除表的。 更改数据类型 向您展示如何更改的数据。 重命名列 说明如何重命名表的一或多。...数组 向您展示如何使用数组,并向您介绍一些用于数组操作的方便函数。 hstore 向您介绍数据类型,它是存储在 PostgreSQL 单个值的一组键/值对。...JSON 说明如何使用 JSON 数据类型,并向您展示如何使用一些最重要的 JSON 运算符和函数。

    52210

    构建AI前的数据准备,SQL要比Python强

    随着产业发展,生产系统的数据非常混乱,需要进行大量转换才能用于构建 AI。有些 JSON 每行模式都不相同,有些包含混合数据类型,有些行有错误值。...在这里,我使用 lag 和 first_value 函数来查找用户历史记录的特定记录(即分区)。然后使用 age 函数来确定两次访问间的时间差。...对我来说,另一个改变是我意识到 Postgres 可以很好地处理 json。...在这种情况下,我要么重新编码数据使其有效,或者删除无效的行。为此,我创建了一个名为 is_json 的新 SQL 函数,然后使用该函数来验证 WHERE 子句中的 json 是否有效。...我现在的工作模式是「不要将数据移动到代码,而是将代码移动到数据」。Python 将数据移动到代码,而 SQL 执行后者。更重要的是,我知道我只是触及了 SQL 和 postgres 的皮毛。

    1.5K20

    构建AI前的数据准备,SQL要比Python强

    随着产业发展,生产系统的数据非常混乱,需要进行大量转换才能用于构建 AI。有些 JSON 每行模式都不相同,有些包含混合数据类型,有些行有错误值。...在这里,我使用 lag 和 first_value 函数来查找用户历史记录的特定记录(即分区)。然后使用 age 函数来确定两次访问间的时间差。...对我来说,另一个改变是我意识到 Postgres 可以很好地处理 json。...在这种情况下,我要么重新编码数据使其有效,或者删除无效的行。为此,我创建了一个名为 is_json 的新 SQL 函数,然后使用该函数来验证 WHERE 子句中的 json 是否有效。...我现在的工作模式是「不要将数据移动到代码,而是将代码移动到数据」。Python 将数据移动到代码,而 SQL 执行后者。更重要的是,我知道我只是触及了 SQL 和 postgres 的皮毛。

    1.5K20

    Apache Kafka - 构建数据管道 Kafka Connect

    其中最流行的有: 这些连接器的更详细信息如下: RDBMS连接器:用于从关系型数据库(如Oracle、SQL Server、DB2、Postgres和MySQL)读取数据,并将其写入Kafka集群的指定主题...通过将任务状态存储在Kafka,Kafka Connect可以实现弹性、可扩展的数据管道。这意味着可以随时启动、停止或重新启动任务,而不会丢失状态信息。...在Kafka Connect,数据通常以字节数组的形式进行传输。Converters负责将Java对象序列化为字节数组,并将字节数组反序列化为Java对象。...ELT 保留原始数据,更灵活。 安全性:数据加密,认证和授权,审计日志。Kafka 支持这些安全特性。 故障处理:处理异常数据,重试并修复。因为 Kafka 长期保留数据,可以重新处理历史数据。...在这种方式下,数据从源系统提取出来后,首先加载到目标系统,然后再在目标系统内进行转换和处理。

    91220
    领券