2009-11-18 14 views
16

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

Lo necesito porque, 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, ¡así que todas las buenas ideas son bienvenidas!

+0

Por curiosidad, ¿por qué contar las palabras en un campo? – Peter

Respuesta

17

Hay REGEXP_REPLACE disponible como MySQL user-defined functions.

Conteo de palabras: Si puede controlar los datos que entran en la base de datos, puede eliminar los espacios en blanco dobles antes de insertarlos. Además, si tiene que acceder al conteo de palabras con frecuencia, puede calcularlo una vez en su código y almacenar el conteo en la base de datos.

+0

siento aceptar tan tarde ... – PierrOz

0

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

Pero le recomiendo que consulte este anterior question sobre el tema que enlaza con una UDF que supuestamente habilita parte de esta funcionalidad.

1

Casi un duplicado de this question pero esta respuesta abordará el caso de uso de conteo de palabras basado en la versión avanzada del sustituto de expresiones regulares personalizado de this blog post.

demostración

Rextester online demo

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; 
Cuestiones relacionadas