Как подсчитать слова в MySQL / регулярном выражении replacer?

Как я могу в запросе MySQL иметь такое же поведение, как функция Regex.Replace (например, в .NET / C #)?

Мне нужно это, потому что, как и многие люди, я хотел бы подсчитать количество слов в поле. Однако я не удовлетворен следующим ответом (несколько раз на этом сайте):

SELECT LENGTH(name) - LENGTH(REPLACE(name, ' ', '') +1 FROM table 

Потому что это не дает хороших результатов, когда есть еще одно пространство между двумя словами.

Кстати, я думаю, что функция Regex.Replace может быть интересной, поэтому приветствуем все хорошие идеи!

REGEXP_REPLACE доступен как пользовательские функции MySQL .

Подсчет слов: если вы можете управлять данными, поступающими в базу данных, вы можете удалить двойные пробелы перед вставкой. Также, если вам нужно часто обращаться к счету слов, вы можете вычислить его один раз в своем коде и сохранить счет в базе данных.

UPDATE: добавили отдельный ответ для MySQL 8.0+ , который следует использовать в предпочтении. (Сохранялся этот ответ в случае ограничения предыдущей версии.)

Почти дубликат этого вопроса, но в этом ответе будет рассмотрен пример использования слов, основанных на расширенной версии настраиваемого заменителя регулярных выражений из этого сообщения в блоге .

демонстрация

Демо-версия реестров

Для текста примера это дает количество 61 – то же самое, что и все онлайн-счетчики слов, которые я пробовал (например, https://wordcounter.net/ ).

SQL (исключая код функции для краткости) :

 SELECT txt, -- Count the number of gaps between words CHAR_LENGTH(txt) - CHAR_LENGTH(reg_replace(txt, '[[:space:]]+', -- Look for a chunk of whitespace '^.', -- Replace the first character from the chunk '', -- Replace with nothing (ie remove the character) TRUE, -- Greedy matching 1, -- Minimum match length 0, -- No maximum match length 1, -- Minimum sub-match length 0 -- No maximum sub-match length )) + 1 -- The word count is 1 more than the number of gaps between words - IF (txt REGEXP '^[[:space:]]', 1, 0) -- Exclude whitespace at the start from count - IF (txt REGEXP '[[:space:]]$', 1, 0) -- Exclude whitespace at the end from count AS `word count` FROM tbl; 

Ответ: нет, вы не можете иметь такое же поведение в MySQL.

Но я рекомендую вам проверить этот более ранний вопрос по теме, который ссылается на UDF, который предположительно включает некоторые из этих функций.

MySQL 8.0 теперь обеспечивает достойную функцию REGEXP_REPLACE , что делает это намного проще:

SQL

 SELECT -- Count the number of gaps between words CHAR_LENGTH(txt) - CHAR_LENGTH(REGEXP_REPLACE( txt, '[[:space:]]([[:space:]]*)', -- A chunk of one or more whitespace characters '$1')) -- Discard the first whitespace character and retain the rest + 1 -- The word count is 1 more than the number of gaps between words - IF (txt REGEXP '^[[:space:]]', 1, 0) -- Exclude whitespace at the start from count - IF (txt REGEXP '[[:space:]]$', 1, 0) -- Exclude whitespace at the end from count AS `Word count` FROM tbl; 

демонстрация

Демо-версия DB-Fiddle

Давайте будем гением компьютера.