当前位置: 首页 > 面试题库 >

PostgreSQL,从JSON数组中检索特定键的值

葛嘉悦
2023-03-14
问题内容

我有对象的Postgres JSONB数组,看起来像这样:

'[
  {
    "skillId": "1",
    "skillLevel": 42
  },
  {
    "skillId": "2",
    "skillLevel": 41
  }
]'

此JSONB是一个函数参数。

什么是最有效的检索skillLevel方法 skillId = "1"

我尝试过玩,jsonb_array_elements但是到目前为止我所做的一切看起来都非常混乱。


问题答案:

Postgres 9.4+中 ,可以jsonb_array_elements()在横向 联接中 使用该函数:

select (elem->>'skillLevel')::int as skill_level
from my_table
cross join jsonb_array_elements(json_col) elem
where elem->>'skillId' = '1';

您可以通过一个简单的函数来实现该想法,例如:

create or replace function extract_skill_level(json_data jsonb, id int)
returns integer language sql as $$
    select (elem->>'skillLevel')::int
    from jsonb_array_elements(json_data) elem
    where elem->>'skillId' = id::text
$$;

select extract_skill_level(json_col, 1) as skill_level
from my_table;

Postgres 12+中, 您可以使用jsonb路径函数的形式来替代:

select (
    jsonb_path_query(
        json_col, 
        '$[*] ? (@.skillId == "1")'
        )->'skillLevel'
    )::int as skill_level
from my_table;

Db
<>提琴。

阅读有关JSON函数和运算符的更多信息。



 类似资料:
  • 我有一个用Java编写的管理应用程序,可以管理我的用户 我创建了一个自定义json 这就是我的JSON看起来的样子 在我的列表中,我只显示电子邮件地址 现在我的问题,例如,如果我单击包含电子邮件的列表,我想在对话框中显示与此电子邮件相关的数据,即、和 怎样​​我可以检索其他值吗​​使用电子邮件? 我在网上找不到任何关于它的信息

  • 问题内容: 我有这个数组: 并且我正在寻找一个PHP“ for each”循环,该循环将检索下的键名,即: 我怎样才能做到这一点? 问题答案: 试试吧 在$ key中,您将获得密钥名称,在val中,您将获得值

  • 问题内容: 我有一个问题想寻求您的专业知识。 这是我拥有的JSON数组: 我想做的是从JSON数组而不是值中检索键(A,B,C,D,E)。我能够检索值,但不能检索键。 我正在使用它来动态检索值: 同样,我应该怎么做才能使用JavaScript 检索 密钥 ? 问题答案: 您是否按照标签所暗示的那样使用D3.js?因为在这种情况下,您可以使用: 如果您想要所有值的总和,最好使用和:

  • 我是一个Laravel新手,我正在转换一个php/jQuery应用程序到Laravel。原始代码使用带有ajax POST的JSON数组,检索如下: 我在POST方面也做了很多相同的事情,但我在我的Laravel$请求收集中没有看到任何数据。我是否需要做一些特殊的事情来检索如下结构的JSON数据: 这是我的jQuery ajax POST代码(带有硬编码数据) 这是我的控制器中接收POST的代码

  • 问题内容: 参考原始的stackoverflow问题,我试图将gin索引应用于Postgres 9.4中数组对象中的键,但没有得到第一个答案中所述的结果。 您能纠正错误吗? 我遵循的步骤已写在下面。 第1部分:创建表和索引 第2部分:查询 该查询给出空结果。 我也尝试使用GIN索引。 替代索引和查询: 问题答案: 原始答案中的这个特定jsonb示例缺少用于包含查询的非原始对象周围的数组层。此后已修

  • 问题内容: 我有一个JSON对象数组,想返回一个特定的节点。为了简化我的问题,可以说数组看起来像这样: 例如,我想知道骑士的实力。函数,返回路径,使用路径运算符可以得到强度。有没有办法将两者结合起来,所以我可以做下面的事情? 我正在使用MySQL 8.0.15。 问题答案: 本质上,您的意思是将选择和投影应用于JSON文档的数组元素和对象字段。您需要执行WHERE子句之类的操作来选择数组中的“行”