在一次數據遷移中,遇到的一個場景。需要從一串 JSON 中提取其中一段字符串。在 Bing 上搜索發現很少在 Postgresql 中用到字符串截取的。下面是解決的方法,不一定好,但恰好可以解決問題。
JSON 字符串
'{"item":{"id":"c0540d7e-bedb-4521-b2b1-401d099575d1","name":"這時一張圖片.jpg","path":"5cbf3cff-4be0-4f82-b21a-34ccbb93e830/15a8164e-6244-4369-96bd-3fa5f6a24ff9/823b93f69867ad18501057e4312793dc.jpg","createdUserId":"5cbf3cff-4be0-4f81-b21a-34ccbb93e830","hash":"823b93f69867ad18501057e43e2793dc","createdUserName":"Admin","type":".jpg","size":47505408,"createdAt":"2019-05-25T11:54:33.5207074+08:00","url":"http://221.178.13.191:9021/5cbf3cff-4be0-4f81-b21a-34ccbb93e830/15a8164e-6244-4369-96bd-4fa5f6a24ff9/823b93f69867ad18501057e43e2793dc.jpg","completed":false,"tag":null,"tags":["BIM_MANAGER","500103","MUNICIPAL","CONSTRUCTION_APPLY_PHASE"]},"success":true}'
原始信息如上,現在需要將粗體部分截取出來。用到時方法是 regexp_split_to_table,該方法可以將字符串分割成行。
第一次執行(其中第二個參數的 E 是 Postgresql 正則的語法)
SELECT regexp_split_to_table(JSON字符串, E',"path":"')
圖1
可以看到第二行中已經出現了我們需要的結果了。但是還不能直接使用。於是。。。再截一次。
第二次執行(得到最終結果)
SELECT regexp_split_to_table
(
regexp_split_to_table
(
JSON字符串, E',"path":"'
),
E'.jpg",'
)
|| '.jpg'
LIMIT 1 OFFSET 1;
圖2
說明:
1.第一層 regexp_split_to_table 得到兩條數據如圖1
2.第二層 regexp_split_to_table 從第一層的第二條結果中繼續截取,得到數據如圖2
3.圖2中第二條數據就離最終結果非常接近了,所以再給字符串后面加上.jpg
4.使用 LIMIT 1 OFFSET 1 語句獲取第二條數據,就是最終的結果數據如圖3
圖3