Да, можно и так, наверное, но придется организовать транспонирование (pivot - я так понимаю, речь именно об этом). Еще раз - версия 8i, фокусы с sys_connect_by_path (как в 9+) или регулярные выражения (10+) - не проходят :-(((
А задача вылезла из необходимости организовать выборку из таб. с текстовым полем (назовем tab1.str) такую, что tab1.str содержит хотя бы одно слово (точное соответствие) из поля другой таблицы (пусть tab2.str). Регистр, колич. пробелов между словами, длина слова - не берем в голову, не проблема. Само совпавшее слово тоже неинтересно, как и их количество; нужет только ответ на вопрос: есть общие слова или нет. Иной связи между таблицами нет, размеры большие - сотни тыс. записей в обеих. Нашлепать функций-процедур - не вопрос, но - не годится, медленно. Как вариант - чистый sql (пусть и 8-этажный) на суперпозиции встроенных функций...
Пока делаю так:
1) строку tab1.str (по ходу выборки) на лету транспонирую а-ля
select z.wd
from
(
select
substr(s.nstr,instr(s.nstr,' ',1,rownum)+1,
instr(s.nstr,' ',1,rownum+1)-instr(s.nstr,' ',1,rownum)-1) wd
from
(
select
' '||translate(str,' '||fmt,rpad(' ',100,' '))||' ' nstr
from (
select
'строка из таблички tab1.str' str,
' %^":-_=+(),.;/\<>' fmt -- blanks
from dual )
) s,
( select 1 from dual group by cube(1,1,1,1,1,1,1,1) ) n
) z
where z.wd is not null
2) проверяю условием
exists от ( преобразованная <tab2.str> like '% '||z.wd||' %' )
Гораздо быстрее вызова user-def функций, но все-равно вряд ли оптимально так издеваться над сервером и строить декарт искусственно. Отсюда и вопрос: может, кто уже наступал на подобные грабли?