Postgresql 字符串截取

在一次数据迁移中,遇到的一个场景。需要从一串 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

原文地址:https://www.cnblogs.com/fxck/p/13076595.html