sách gpt4 ai đã đi

Postgres JSONB: mệnh đề where cho các mảng của mảng

In lại 作者:行者123 更新时间:2023-11-29 11:40:19 28 4
mua khóa gpt4 Nike

postgres 中有(v 9.5,如果重要的话):

create table json_test(
id varchar NOT NULL,
data jsonb NOT NULL,
PRIMARY KEY(id)
);

其中数据是json,包含数组的数组

{
"attribute": "0",
"array1": [{
"id": "a12",
"attribute": "1",
"array2": [{
"id": "a21",
"attribute": "21"
}]
},
{
"id": "a12",
"attribute": "2",
"array2": [{
"id": "22",
"attribute": "22"
}]
}]
}

必需:

select id from json_test where 
json_test->>'attribute'='0' and
array1.[id='a12'].array2.attribute='22'

查询的意思应该是:给我所有的id

  1. 一些顶级属性有特定的值
  2. 数组中的特定对象具有必需的属性
  3. 某些对象(来自 array2)特别是 array1 具有必需的属性

诀窍在于如何实现最后一个条件。


另一个例子:

{
"attribute": "0",
"array1": [{
"id": "a12",
"attribute": "1",
"array2": [{
"id": "a21_1",
"attribute_1": "21_1"
},{
"id": "a21_2",
"attribute_2": "21_2"
}]
}]
}

select * from json_test where
array1.[id='a12'].array2.attribute_1='21_1' and
array1.[id='a12'].array2.attribute_2='21_2'

1 Câu trả lời

检索嵌套 json 数组的最通用方法是使用多个 jsonb_array_elements()在横向连接。示例:

with json_test(id, data) as (
giá trị
(1,
'{
"attribute": "0",
"array1": [{
"id": "a12",
"attribute": "1",
"array2": [{
"id": "a21",
"attribute": "21"
}]
},
{
"id": "a12",
"attribute": "2",
"array2": [{
"id": "22",
"attribute": "22"
}]
}]
}'::jsonb)
)

select id, elem2
từ
json_test,
jsonb_array_elements(data->'array1') array1(elem1),
jsonb_array_elements(elem1->'array2') array2(elem2)
where elem2->>'id' = '22';

id | elem2
----+---------------------------------
1 | {"id": "22", "attribute": "22"}
(1 row)

该方法是通用的,因为您可以轻松访问任何级别的任何 json 对象的任何值,例如:

...
Ở đâu
data->>'attribute' = '0'
and elem1->>'id' = 'a12'
and elem2->>'id' = 'a21_1';

关于arrays - Postgres JSONB : where clause for arrays of arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38201823/

28 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com