![](/img/trans.png)
[英]How to loop through JSON array of JSON objects to see if it contains a value that I am looking for in postgres?
[英]Postgres | How to extract a value from JSON array that contains multiple JSON objects
我有一個表,其中包含一個名為additional_info
的列。 此列包含 JSON object,如下所示:
{
"dbSources": [{
"destIp": "10.10.10.29",
"serviceType": "PostgreSql",
"srcIp": "10.10.10.68",
"database": "xe",
"clusterMember": "",
"dbId": "PostgreSql_10.10.10.29",
"clusterName": "",
"host": "",
"dbUser": "system",
"osUser": "",
"userType": "Unknown",
"srcApp": ""
},{
"destIp": "10.10.10.29",
"serviceType": "PostgreSql",
"srcIp": "10.10.10.69",
"database": "xe1",
"clusterMember": "",
"dbId": "PostgreSql_10.10.10.29",
"clusterName": "",
"host": "",
"dbUser": "system",
"osUser": "",
"userType": "Unknown",
"srcApp": ""
}]
}
我想提取(選擇)“數據庫”的值,其中srcIp
等於10.10.10.68
。 這意味着我想從名為dbSources
的 JSON 數組下的第一個 JSON object 中提取值“xe”。
我唯一能做的就是
select additional_info::json ->'dbSources' as db from table
但我怎樣才能從那里繼續呢?
你可以這樣做:
with query as (
select j->>'database' as db,j->>'srcIp' as src_ip from json_array_elements('{
"dbSources": [{
"destIp": "10.10.10.29",
"serviceType": "PostgreSql",
"srcIp": "10.10.10.68",
"database": "xe",
"clusterMember": "",
"dbId": "PostgreSql_10.10.10.29",
"clusterName": "",
"host": "",
"dbUser": "system",
"osUser": "",
"userType": "Unknown",
"srcApp": ""
},{
"destIp": "10.10.10.29",
"serviceType": "PostgreSql",
"srcIp": "10.10.10.69",
"database": "xe1",
"clusterMember": "",
"dbId": "PostgreSql_10.10.10.29",
"clusterName": "",
"host": "",
"dbUser": "system",
"osUser": "",
"userType": "Unknown",
"srcApp": ""
}]
}'::json->'dbSources') as j)
select db from query where src_ip = '10.10.10.68'
您可以使用 JSON 路徑查詢:
select jsonb_path_query_first(additional_info, '$.dbSources[*] ? (@.srcIp == "10.10.10.68").database')
from the_table
這假定該列的類型為jsonb
(它應該是)。 如果不是,則需要轉換它: additional_info::jsonb
對於名為 table_name 的表,此查詢將提取 srcIp 為 '10.10.10.68' 的數據庫的值
SELECT obj::json#>'{database}' as db_name FROM edisondb.demo r, json_array_elements(r.some_text::json#>'{dbSources}') obj WHERE obj->>'srcIp' = '10.10.10.68';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.