При использовании списков часто возникает необходимость в разбиении получившейся строки на токены по разделителю. Привожу пример, позволяющий это сделать.
withq_item_list as (select 'a,b,cv,d,r,e,,df,f,' list, ',' delimiter, '''' quotationfrom dual),q_item_list_prepared as (select quotation||replace(list, delimiter, quotation||delimiter||quotation)||quotation list, delimiter, quotationfrom q_item_list)selectregexp_substr(list, '['||quotation||']([^'||delimiter||']*)['||quotation||']+',1,level,'mi',1)fromq_item_list_preparedconnect byregexp_substr(list, '[^'||delimiter||']+',1,level) is not null
В данном случае строкой, имитирующей список является строка 'a,b,cv,d,r,e,,df,f,' (см q_item_list), разделителем я выбрал запятую, а обрамляющим символом принимается одиночный апостроф.
Первым делом квотируем все элементы списка апострофами с обеих сторон, чтобы не потерять при разбиении пустые элементы (см. q_item_list_prepared). После этого спокойно нарезаем все элементы по разделителю и после этого удаляем обрамляющие символы.
Если перед нами стоит задача получить из этой строки только непустые элементы, то все резко упрощается:
withq_item_list as (select'a,b,cv,d,r,e,,df,f,' list, ',' delimiter, '''' quotationfromdual)selectregexp_substr(list, '[^'||delimiter||']+',1,level)fromq_item_listconnect byregexp_substr(list, '[^'||delimiter||']+',1,level) is not null
В данном запросе мы ничего не подготавливаем к нарезке, а просто режем строку по разделителю.