1. 程式人生 > >SQL篇·Oracle欄位根據逗號等分割

SQL篇·Oracle欄位根據逗號等分割

一、業務場景介紹

有一個表字段儲存了另一個表的關聯欄位,以“|”符號分割,如下所示:

連線查詢中當然可以使用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更加複雜,這裡只記錄樣例,需要時可以拿來靈活調整。