2017-07-13 332 views
0

如何使用postgres查詢從下面的json字符串化字符串獲取值?我正在使用正則表達式來做到這一點,但我試圖寫一些更通用/簡單/可信的查詢。是的,我不相信我寫的東西,我非常確定我會有什麼打破。使用postgres從Json字符串化字符串獲取數據

這是我有:

SELECT 
trim(both '" 'FROM replace(regexp_replace('phone_data', '[\\] 
{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'gpslogs' -> 0 ->> 'cataract' 
FROM 
    "JSON" 
WHERE 
    "ID" = 'eb7613c6-e7aa-4b46-984e-ebf334293fdb'; 

這是該數據的樣子:

{ 
"glossary": { 
    "title": "example glossary", 
    "GlossDiv": { 
     "title": "S", 
     "GlossList": { 
      "GlossEntry": { 
       "ID": "SGML", 
       "SortAs": "SGML", 
       "GlossTerm": "Standard Generalized Markup Language", 
       "Acronym": "SGML", 
       "Abbrev": "ISO 8879:1986", 
       "GlossDef": { 
        "para": "A meta-markup language, used to create markup languages such as DocBook.", 
        "GlossSeeAlso": ["GML", "XML"] 
       }, 
       "GlossSee": "markup" 
      } 
     } 
    } 
} 

}

感謝您的幫助和建議。謝謝。

+0

您不應該在PostgreSQL中使用正則表達式來操作JSON。 [Postgres有大量用於搜索和操作JSON數據的JSON函數](https://www.postgresql.org/docs/current/static/functions-json.html)。你想從這個JSON中獲得什麼? – Schwern

+0

我們假設在這個例子中,我想要海拔高度場 – Anusha

+0

@Schwern你是否也注意到在開始和結尾處多出一對雙引號 – Anusha

回答

0

看來你已經雙重編碼JSON數據。所有真正的JSON似乎被搗毀成一個大字符串值,然後你必須解碼,解析爲JSON(擊敗JSONB),然後搜索。

經驗法則是不要嘗試使用垃圾數據。相反,修復它,然後處理所產生的清潔數據。這使得一切都變得更快捷,減少錯誤,使用更少的內存,並節省了大量的編程時間。

這意味着要做一個單獨的update來修復JSON數據。確保在執行此操作時進行事務處理,以便在出錯時可以回滾。而且您必須更改導入器才能在插入之前修復傳入的數據。最後,可能會有其他查詢假設JSON格式錯誤,必須將其更改爲使用明智的JSON。

然後您可以正常查詢JSONB列。

select phone_device_data->'objects'->0->'data'->'gps_location_logs'->0->>'latitude' 
from json_storage 
where id = 'eb7613c6-e7aa-4b46-984e-ebf334293fdb'; 
+0

不行,不適合我。你刪除了多餘的引號並嘗試這個嗎? – Anusha

+0

@Anusha如果你發佈的所有奇怪的轉義值都是'phone_device_data'列中的值,那麼你的數據就會非常非常非常錯誤。您發佈了無效的JSON,並且JSONB字段不能包含無效的JSON。我懷疑'phone_device_data'實際上並不是JSONB,或者它只是一個帶有轉義亂碼的大字符串字段,或者你發佈的東西不是真正的值(即通過某個GUI或程序過濾)。也許粘貼'從json_storage中選擇phone_device_data,其中id ='eb7613c6-e7aa-4b46-984e-ebf334293fdb''某處。 – Schwern

+0

相信我,就是這樣。這就是爲什麼我使用正則表達式。 – Anusha