首先提供测试数据:
字符串: '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这条数据
*/