SQL篇·Oracle欄位根據逗號等分割
阿新 • • 發佈:2018-12-21
一、業務場景介紹
有一個表字段儲存了另一個表的關聯欄位,以“|”符號分割,如下所示:
連線查詢中當然可以使用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更加複雜,這裡只記錄樣例,需要時可以拿來靈活調整。