【发布时间】: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.
我究竟做错了什么?
【问题讨论】: