【问题标题】:SQL get the value of a key inside a key inside a key (and so on) in a jsonb fieldSQL 获取 jsonb 字段中的键中的键(等等)中的键的值
【发布时间】:2022-10-19 18:00:18
【问题描述】:

假设我有一个表my_table,其字段名为data,类型为jsonb,因此包含一个json 数据结构。

假设如果我跑

select id, data from my_table where id=10;

我明白了

 id |                                     data
------------------------------------------------------------------------------------------
 10 | { 
    |"key_1": "value_1" ,
    |"key_2": ["value_list_element_1", "value_list_element_2", "value_list_element_3" ],
    |"key_3": {
    |          "key_3_1": "value_3_1", 
    |          "key_3_2": {"key_3_2_1": "value_3_2_1", "key_3_2_2": "value_3_2_2"}, 
    |          "key_3_3": "value_3_3" 
    |          }
    | }

所以在漂亮的格式中,data 列的内容是

{
  "key_1": "value_1",
  "key_2": [
    "value_list_element_1",
    "value_list_element_2",
    "value_list_element_3"
  ],
  "key_3": {
    "key_3_1": "value_3_1",
    "key_3_2": {
      "key_3_2_1": "value_3_2_1",
      "key_3_2_2": "value_3_2_2"
    },
    "key_3_3": "value_3_3"
  }
}

我知道,如果我想直接在列中获取 json 的键(“级别 1”)的值,我可以使用 ->> 运算符来完成。

比如我想得到key_2的值,我要做的是

select id, data->>'key_2' alias_for_key_2 from my_table where id=10;

返回

 id |                                alias_for_key_2
------------------------------------------------------------------------------------------
 10 |["value_list_element_1", "value_list_element_2", "value_list_element_3" ]

现在假设我要获取key_3_2_1 的值,即value_3_2_1

我该怎么做?

我试过了

select id, data->>'key_3'->>'key_3_2'->>'key_3_2_1' alias_for_key_3_2_1 from my_table where id=10;

但我明白了

select id, data->>'key_3'->>'key_3_2'->>'key_3_2_1' alias_for_key_3_2_1 from my_table where id=10;
                         ^
HINT:  No operators found with name and argument types provided. Types may need to be converted explicitly.

我究竟做错了什么?

【问题讨论】:

    标签: sql json key jsonb


    【解决方案1】:

    查询中的问题

    select id, data->>'key_3'->>'key_3_2'->>'key_3_2_1' alias_for_key_3_2_1   --this is wrong!
    from my_table 
    where id=10; 
    

    是不是通过使用->> 操作数我将json 转换为字符串,所以使用下一个->> 操作数我试图从字符串对象中获取json 键对象key_3_2,这是没有意义的。

    因此,必须使用 -> 操作数,它不会将 json 转换为字符串,直到 *he 到达“最终”键。

    所以我正在寻找的查询是

    select id, data->'key_3'->'key_3_2'->>'key_3_2_1' alias_for_key_3_2_1  --final ->> : this gets the value of 'key_3_2_1' as string
    from my_table 
    where id=10;  
    

    select id, data->'key_3'->'key_3_2'->'key_3_2_1' alias_for_key_3_2_1  --final -> : this gets the value of 'key_3_2_1' as json / jsonb
    from my_table 
    where id=10;  
    

    【讨论】:

      猜你喜欢
      • 2020-05-12
      • 2012-01-22
      • 2020-06-28
      • 2019-09-24
      • 1970-01-01
      • 2021-08-03
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多