PostgreSQL 从 jsonb 中提取键,异常“无法在标量上调用 jsonb_object_keys”

作者:编程家 分类: postgresql 时间:2025-10-21

在使用 PostgreSQL 数据库时,我们经常会遇到需要从 jsonb 类型的字段中提取键的情况。jsonb 是 PostgreSQL 提供的一种数据类型,用于存储和处理 JSON 格式的数据。然而,当我们尝试在标量值上调用 jsonb_object_keys 函数时,有时会遇到异常信息"无法在标量上调用 jsonb_object_keys"。在本文中,我们将讨论这个异常的原因,并提供解决方案。

首先,让我们来看一个简单的例子来复现这个异常。假设我们有一个名为 "users" 的表,其中包含一个 jsonb 类型的字段 "info",存储了用户的信息。我们想要从 "info" 字段中提取所有的键。下面是我们的表结构和数据示例:

sql

CREATE TABLE users (

id SERIAL PRIMARY KEY,

info jsonb

);

INSERT INTO users (info) VALUES

('{"name": "John", "age": 30, "email": "john@example.com"}'),

('{"name": "Jane", "age": 25, "email": "jane@example.com"}');

现在,我们尝试使用 jsonb_object_keys 函数从 "info" 字段中提取键:

sql

SELECT jsonb_object_keys(info) FROM users;

然而,当我们执行上述查询时,会得到异常信息"无法在标量上调用 jsonb_object_keys"。那么,为什么会出现这个异常呢?

问题的根源在于我们尝试在标量值上调用 jsonb_object_keys 函数。jsonb_object_keys 函数的作用是返回一个 JSON 对象的所有键作为一个结果集。然而,在我们的查询中,"info" 字段是一个 jsonb 类型的列,而不是一个 JSON 对象。因此,我们需要对这个列进行解析操作,才能使用 jsonb_object_keys 函数。

为了解决这个问题,我们可以使用 jsonb_array_elements 函数来将 "info" 字段解析为一个 JSON 数组,然后再调用 jsonb_object_keys 函数。下面是修改后的查询:

sql

SELECT jsonb_object_keys(jsonb_array_elements(info)) FROM users;

通过这个修改,我们成功地从 "info" 字段中提取了所有的键。现在,让我们对这个解决方案进行详细的解释。

解决方案:使用 jsonb_array_elements 函数解析字段

在我们的解决方案中,我们首先使用 jsonb_array_elements 函数将 "info" 字段解析为一个 JSON 数组。jsonb_array_elements 函数的作用是将一个 JSON 数组展开为多行数据。通过这个操作,我们可以将 "info" 字段中的每个 JSON 对象作为一行数据进行处理。

然后,我们再在解析后的结果集上调用 jsonb_object_keys 函数。由于解析后的结果集中的每一行都是一个 JSON 对象,我们可以直接使用 jsonb_object_keys 函数来提取每个对象的键。

通过这个解决方案,我们成功地解决了在标量值上调用 jsonb_object_keys 函数时出现的异常。现在,我们可以正常地从 jsonb 类型的字段中提取键了。

在使用 PostgreSQL 数据库时,从 jsonb 类型的字段中提取键是一个常见的需求。然而,当我们尝试在标量值上调用 jsonb_object_keys 函数时,有时会遇到异常信息"无法在标量上调用 jsonb_object_keys"。这个异常的原因是我们需要对 jsonb 类型的字段进行解析操作,才能使用 jsonb_object_keys 函数。

为了解决这个问题,我们可以使用 jsonb_array_elements 函数将 jsonb 类型的字段解析为一个 JSON 数组,然后再调用 jsonb_object_keys 函数。通过这个解决方案,我们可以成功地从 jsonb 类型的字段中提取键。

希望本文对你理解并解决"无法在标量上调用 jsonb_object_keys"异常有所帮助!如果你在使用 PostgreSQL 时遇到其他问题,也可以在相关的技术社区中寻求帮助。祝你在 PostgreSQL 数据库的使用中取得成功!