一、业务场景介绍
有一个表字段存储了另一个表的关联字段,以“|”符号分割,如下所示:
连接查询中当然可以使用like来关联,但是效率很差。高效的做法应该是将该字段按照“|”字符分割,然后关联查询。
二、oracle分割查询方法
SELECT
regexp_substr( 'a|b|c', '[^|]+', 1, ROWNUM ) result
FROM
dual CONNECT BY ROWNUM <= length(
regexp_replace( 'a|b|c', '[^|]', NULL )) + 1;
查询结果:
这个是原始的写法,“|”可以是别的字符,可以拿来修改。
三、应用
应用在我的场景中就是:
-- 分割pro_ids
SELECT
regexp_substr( t.PRO_IDS, '[^|]+', 1, ROWNUM ) pro_ids
FROM
( SELECT * FROM CMS_ARTICLE_PREVIEW WHERE id = '3918' ) t
CONNECT BY ROWNUM <= length(regexp_replace( t.PRO_IDS, '[^|]', NULL )) + 1;
查询结果:
查询产品信息可以继续调整sql:
-- 分割pro_ids,并查询出相应产品信息
SELECT * FROM P_PRODUCT_PUBLICINFO WHERE FUNDCODE IN (
SELECT
regexp_substr( t.PRO_IDS, '[^|]+', 1, ROWNUM ) pro_ids
FROM
( SELECT * FROM CMS_ARTICLE_PREVIEW WHERE id = '3918' ) t
CONNECT BY ROWNUM <= length(regexp_replace( t.PRO_IDS, '[^|]', NULL )) + 1
);
为了信息保密性,此处不截图了。
当然,最终实际场景应用的sql更加复杂,这里只记录样例,需要时可以拿来灵活调整。