My домноженная функция замены регулярного выражения может использоваться для этого.
Демо
См. это демо DB-Fiddle , которое возвращает второе слово ("I") из известного сонета и количество его появлений (1).
SQL
Если предположить, что используется MySQL 8 или более поздней версии (чтобы разрешить использование общего табличного выражения ), следующее вернет второе слово и количество его вхождений:
WITH cte AS (
SELECT digits.idx,
SUBSTRING_INDEX(SUBSTRING_INDEX(words, '~', digits.idx + 1), '~', -1) word
FROM
(SELECT reg_replace(UPPER(txt),
'[^''’a-zA-Z-]+',
'~',
TRUE,
1,
0) AS words
FROM tbl) delimited
INNER JOIN
(SELECT @row := @row + 1 as idx FROM
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t1,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t2,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t3,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t4,
(SELECT @row := -1) t5) digits
ON LENGTH(REPLACE(words, '~' , '')) <= LENGTH(words) - digits.idx)
SELECT c.word,
subq.occurrences
FROM cte c
LEFT JOIN (
SELECT word,
COUNT(*) AS occurrences
FROM cte
GROUP BY word
) subq
ON c.word = subq.word
WHERE idx = 1; /* idx is zero-based so 1 here gets the second word */
Объяснение
В вышеприведенном SQL используется несколько приемов, и требуется некоторая аккредитация. Во-первых, заменитель регулярного выражения используется для замены всех непрерывных блоков несловарных символов, каждый из которых заменяется одним символом тильды (~
). Примечание. Вместо этого можно выбрать другой символ, если в тексте есть вероятность появления тильды.
Техника из этот ответ затем используется для преобразования строки с разделенными значениями в значения отдельных строк. Он комбинируется с умным приемом из этого ответа для генерации таблицы, состоящей из последовательности увеличивающихся чисел: в данном случае 0 - 10000.