postgre中一些复杂的字符串与数组操作用法(含数组like)

首先提供测试数据:

字符串:  'CP-A-11-9-4,IC-B-8-8-8,TH-C-3-8-6'

 -- param表中的字段val的值是逗号分割的字符串 CP-A-11-9-4,IC-B-8-8-8,TH-C-3-8-6
SELECT * from unnest(ARRAY['foo','bar','baz']);  --将数组 ['foo','bar','baz'] 转成3行数据
SELECT string_agg(val, ',') from param ; --将CP-A-11-9-4,IC-B-8-8-8,TH-C-3-8-6转成 字符串数组
select unnest(string_to_array( val, ',' ))  from param ; --将CP-A-11-9-4,IC-B-8-8-8,TH-C-3-8-6转成 字符串数组 再转成3行数据

select SPLIT_PART(val, ',', 1)  from param ; --获取  CP-A-11-9-4,IC-B-8-8-8,TH-C-3-8-6 中第一个逗号之前的数据,也就是返回  CP-A-11-9-4
select SPLIT_PART(val, '-', 2)  from param where code=6; --获取val(CP-A-11-9-4)中第2个横杆'-'之前的数据(之前有横杆就截至横杆,没有横杆就截取前面所有字符),也就是返回 A

select substring('sd2sds22ds',1,4); --sd2s 从第一位开始截取,共截取4位
select substring('Thomas' from 2 for 3); --从第2位数开始截3位数

select position('IC' in 'CP-A-11-9-4,IC-B-8-8-8,TH-C-3-8-6'); --IC在字符串中的 下标,以1开头

select 'foo' = ANY(ARRAY['foo','bar','baz']); --判断数组中是否包含 'foo' ,  定义数组:ARRAY['foo','bar','baz']


select SPLIT_PART(v, '-', 2) as da  from (
	select unnest(string_to_array( val, ',' )) v  from param where code=6 
)a where a.v like '%TH%' --将货架参数使用逗号分割成数组,再用unnest转成3行数据 ,再把符合like'TH'的值是'TH-A-1-1',截取第二个横杆前面的值(遇到第一个横杆就结束截取),也就是返回A


--code=6的val返回的是'CP-A-11-9-4,IC-B-8-8-8,TH-C-3-8-6',转数组后再使用unnest转成3条数据后,截取第一个横杆之前的数据,也就是返回3条数据CP , IC, TH
select SPLIT_PART(unnest(string_to_array( val, ',' )), '-', 1) v  from param where code=6 ;


select *  from (
	select 
		SPLIT_PART(unnest(string_to_array( val, ',' )), '-', 1) v , --转数组后再使用unnest转成3条数据后,截取第1个横杆之前的数据
		SPLIT_PART(unnest(string_to_array( val, ',' )), '-', 2) da  --转数组后再使用unnest转成3条数据后,截取第2个横杆之前(截至到第1个横杆)的数据
	from param where code=6  --code=6的val返回的是'CP-A-11-9-4,IC-B-8-8-8,TH-C-3-8-6'
)a where 'CP仓库' like '%'|| a.v||'%'; 
/*like之前返回3条数据:
	CP | A 
	IC | B
	TH | C  
	匹配like之后返回的是 CP | A这条数据
*/

你可能感兴趣的:(sql,数据库)