簡體   English   中英

郵政系統 | 如何從包含多個 JSON 對象的 JSON 數組中提取值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM