Кто-нибудь пробовал select'ом установить факт наличия общих слов в 2-х строках?

valerytin
Дата: 31.05.2006 17:36:56
Без pl/sql.
Может, есть идеи?
andrey_anonymous
Дата: 31.05.2006 17:38:19
valerytin
Без pl/sql.
Может, есть идеи?

Поподробнее можно?
Пока что нарываетесь на group by.
iV@n
Дата: 31.05.2006 17:39:26
одну строку разбить на слова + instr с другой строкой
orawish
Дата: 31.05.2006 17:48:43
10g
SQL> select a.*,b.* from
  2   (select s,regexp_substr(s,'\w+', 1, level, 'm') word
  3    from (select 'Мама мыла раму' s from dual)
  4    connect by regexp_substr(s, '\w+', 1, level, 'm') is not null
  5  ) a
  6  ,(select s,regexp_substr(s,'\w+', 1, level, 'm') word
  7    from (select 'Кошка съела кило мыла' s from dual)
  8    connect by regexp_substr(s, '\w+', 1, level, 'm') is not null
  9  ) b
 10  where a.word = b.word
 11  ;

S              WORD           S                     WORD
-------------- -------------- --------------------- ---------------------
Мама мыла раму мыла           Кошка съела кило мыла мыла
dmidek
Дата: 31.05.2006 17:56:22
orawish
10g


Это ОЧЕНЬ здорово.
valerytin
Дата: 31.05.2006 19:02:39
2iV@n
Наверное, самое разумное для 8i (извиняюсь, сразу не сказал). Пасиб.
Stax.
Дата: 31.05.2006 20:16:37
По одному пробелу между словами
штототакое
SQL> select * from t;

S1
----------------------------
S2
----------------------------
Мама мыла раму
Кошка съела кило мыла

select distinct
substr(s1,instr(' '||s1||' ',' ',1,p1.x),
instr(' '||s1||' ',' ',1,p1.x+1)-instr(' '||s1||' ',' ',1,p1.x)-1
) w1
 from t,pivot p1
,pivot p2
where
p1.x<=length(s1)-length(replace(s1,' '))+1
and p2.x<=length(s2)-length(replace(s2,' '))+1 and
substr(s1,instr(' '||s1||' ',' ',1,p1.x),
instr(' '||s1||' ',' ',1,p1.x+1)-instr(' '||s1||' ',' ',1,p1.x)-1)=
substr(s2,instr(' '||s2||' ',' ',1,p2.x),
instr(' '||s2||' ',' ',1,p2.x+1)-instr(' '||s2||' ',' ',1,p2.x)-1)
/
SQL> /

W1
----------
мыла
SQL> 
.....
stax
Stax.
Дата: 01.06.2006 09:28:11
Учитывая
iV@n
одну строку разбить на слова + instr с другой строкой

тормознул что-то вчера
select distinct
substr(s1,instr(' '||s1||' ',' ',1,p1.x),
instr(' '||s1||' ',' ',1,p1.x+1)-instr(' '||s1||' ',' ',1,p1.x)-1
) w1
,s1,s2
 from (select 'Мама мыла раму' s1,'Кошка съела кило мыла' s2 from dual) t,pivot p1
where
p1.x<=length(s1)-length(replace(s1,' '))+1 and
instr(' '||s2||' ',' '||substr(s1,instr(' '||s1||' ',' ',1,p1.x),
instr(' '||s1||' ',' ',1,p1.x+1)-instr(' '||s1||' ',' ',1,p1.x)-1)||' ')<>0
/
SQL> /

W1             S1             S2
-------------- -------------- ---------------------
мыла           Мама мыла раму Кошка съела кило мыла
.....
stax
valerytin
Дата: 01.06.2006 10:57:36
Да, можно и так, наверное, но придется организовать транспонирование (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 функций, но все-равно вряд ли оптимально так издеваться над сервером и строить декарт искусственно. Отсюда и вопрос: может, кто уже наступал на подобные грабли?
orawish
Дата: 01.06.2006 11:45:41
Я советую сделать реляционную деталь-таблицу 'слова'. Заполнять ее триггером или апи при изменении того текста.