В Oracle 11.2.0.4 ... Учитывая таблицу A, в которой есть длинный столбец varchar с абзацами текста, я хочу проверить, существует ли какое-либо слово в этом тексте в таблице с вертикальным списком особых слов.Я ищу способ сделать это в одном запросе, а не с помощью курсоров.
По сути, я думаю, что мне нужно разбить абзац на слова, а затем объединить таблицу вертикальных слов, но я впотеря в том, что делать дальше.
Example:
TableA:
+----+--------------------------------------------+
| id | comments |
+----+--------------------------------------------+
| 1 | This sentence has no reference to any word |
| 2 | But this one references jungle |
| 3 | And this one references Trees |
+----+--------------------------------------------+
TableB:
+----+---------+
| id | word |
+----+---------+
| 1 | Jungle |
| 2 | Forest |
| 3 | Trees |
| 4 | Animals |
| 5 | River |
+----+---------+
Учитывая эти таблицы, я бы хотел один SQL-запрос, который сказал бы мне, что строки 2 и 3 таблицы A содержат слова, которые существуют в таблице B.
Я рассмотрел использование функции xmltype, чтобы разбить таблицу на слова, а затем объединить их вместе следующим образом:
select id,
(select count(1) from tableb f, xmltable(
'/r/c/text()'
passing xmltype('<r><c>'||replace((regexp_replace(comments, '[^a-z][^A-Z]')), ' ', '</c><c>')||'</c></r>')
columns subs varchar2(4000) path '.'
) s where trim(f.word) = trim(s.subs)) words_found, comments
from tablea
where trim(comments) is not null
, но это не очень хорошо работает.Он может обработать только небольшой набор строк комментариев до сбоя.
Заранее спасибо, и я прошу прощения, если на этот вопрос был дан ответ.Я довольно много проверял и не нашел то, что искал.