我有一個使用benthos.dev/Golang 創建的postgres 表,并且無法更改它的創建方式。該表將 json 資料作為字串插入列中。一個單獨的benthos yaml 將使用postgres 來查詢這個。對于該表中的 select 陳述句,其目的是為“system”找到具有給定名稱的元素并回傳相應“value”的值。(不是系統的值,稱為“值”的元素的值)所有回應都需要在同一行上。這是一個模擬列名:Suigeneris
| 姓名 | 西屬 |
|---|---|
| 巴茲 | [{"system":"https://alpha.com/externalid","use":"home","value":"JJO5H0001"},{"system":"http://gee.org/berlin /uni/Suigeneris-num","use":"usual","value":"2122206077"}] |
選擇的所需輸出是
| 姓名 | 西屬 | 隋阿爾法 | 瑞士柏林 |
|---|---|---|---|
| 巴茲 | [{"system":"https://alpha.com/externalid","use":"home","value":"JJO5H0001"},{"system":"http://gee.org/berlin /uni/Suigeneris-num","use":"usual","value":"2122206077"}] | JJO5H0001 | 2122206077 |
我嘗試了兩種方法,并使用此查詢來獲取有關使用 postgres 選擇所需資料的建議。我嘗試在 postgres 中通過計算 {} 的位置然后使用它來分隔來執行此操作,但這會造成難以閱讀且容易弄亂長查詢。
例子:
select substring (Suigeneris from (position ( '{' IN Suigeneris )) for (position ( '}' IN Suigeneris ))-(position ( '{' IN Suigeneris )))
from table
我只嘗試了第一個位置。
我也嘗試使用 regex_match 并且這有效,但確實要求名稱的順序始終相同(例如“系統優先)。看起來這是真的,但不確定如果源系統決定切換它會發生什么。
SELECT (regexp_match(identifier,'("system":"http:\/\/gee.org\/berlin\/uni\/Suigeneris-num.*)(?=})')) as npi
FROM table
但是,問題是我必須將該查詢放入 YAML 檔案并獲得“節點端的意外標量” - 我嘗試使用單引號轉義雙引號 '"' 和雙引號 """。查看 Yaml 檔案,我不了解解決方案。postgres 查詢將進入一個 yaml 檔案。
再次注意,目的是讀取一個名稱:值對并從該物件中的另一個名稱:值對中提取值。對于“system”:“https...alpha...”,提取“value”的值。兩種解決方案都提取與一個值相關的整個序列,目的是在下一步中提取所需的值。但獲得所描述的值將是理想的。沒有理由將整個物件保留在 {} 中。
一個選項可能是在正則運算式中獲取前瞻匹配以獲取“柏林”文本之前的第一個括號而不指定整個字串。我未能找到一種方法將正則運算式定位在“berlin”處,并在此之前和之后找到第一個 { 作為匹配項。這可能允許沒有完整的 https 地址,并可能解決 yaml 標量問題。
或者可能有更好的方法使用“PostgreSQL 14.2
uj5u.com熱心網友回復:
您可以為此使用JSON 路徑查詢:
select name,
"unique",
jsonb_path_query_first("unique", '$[*] ? (@.system == "https://alpha.com/externalid").value') #>> '{}' as unique_alpha,
jsonb_path_query_first("unique", '$[*] ? (@.system == "http://gee.org/berlin/uni/unique-num").value') #>> '{}' as unique_berlin
from the_table
jsonb_path_query_first回傳一個jsonb值。不幸的是,沒有直接從jsonb. 為此#>> '{}'使用。
請注意,unique對于列名來說,這是一個非常糟糕的選擇,因為這是一個保留關鍵字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/469541.html
標籤:json 正则表达式 PostgreSQL
