Pregunta

¿Cómo puedo, en una consulta MySQL, tienen el mismo comportamiento que la función Regex.Replace (por ejemplo, en .NET / C #)?

Necesito que debido a que, como muchas personas, me gustaría contar el número de palabras en un campo. Sin embargo, no estoy satisfecho con la respuesta siguiente (dado varias veces en ese sitio):

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

Debido a que no da buenos resultados cuando hay más de un espacio entre dos palabras.

Por cierto, creo que la función Regex.Replace puede ser interesante por lo que todas las buenas ideas son bienvenidas!

¿Fue útil?

Solución

Hay REGEXP_REPLACE disponible como MySQL .

conteo de palabras: Si usted puede controlar los datos que entran en la base de datos, puede eliminar el doble espacio en blanco antes de inserción. Además, si usted tiene que tener acceso a cuenta a menudo la palabra, se puede calcular que una vez en su código y almacenar la cuenta en la base de datos.

Otros consejos

ACTUALIZACIÓN: Ahora ha agregado una respuesta separada para MySQL 8.0 o superior, que debe ser usado con preferencia. (Retención de esta respuesta en caso de ser constrainted a la utilización de una versión anterior.)

Casi un duplicado de esta pregunta, pero esta respuesta se abordará el caso de uso de contar palabras basado en la versión avanzada del sustituto de expresión personalizada regular a partir de esta entrada de blog .

Demostración

Rextester línea de demostración

Para el texto de la muestra, esto da un recuento de 61 - lo mismo que todos los contadores de palabras en línea que he probado (por ejemplo, https :. //wordcounter.net/ )

SQL (excluyendo el código de función por razones de brevedad)

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 (i.e. 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;

La respuesta es no, no puede tener el mismo comportamiento en MySQL.

Pero te recomiendo pago y envío antes sobre el tema que une a una UDF que supuestamente permite a algunas de esta funcionalidad.

MySQL 8.0 proporciona ahora un REGEXP_REPLACE función, lo que hace que esta mucho más simple:

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;

Demostración

DB-violín demostración en línea

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top