Question

Comment puis-je, dans une requête MySQL, ont le même comportement que la fonction Regex.Replace (par exemple dans .NET / C #)?

J'ai besoin parce que, comme beaucoup de gens, je voudrais compter le nombre de mots dans un champ. Cependant, je ne suis pas satisfait de la réponse suivante (donnée à plusieurs reprises sur ce site):

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

Parce qu'il ne donne pas de bons résultats quand il y a plus d'un espace entre deux mots.

Par ailleurs, je pense que la fonction Regex.Replace peut être intéressant pour toutes les bonnes idées sont les bienvenues!

Était-ce utile?

La solution

Il y a regexp_replace disponible MySQL fonctions définies par l'utilisateur .

comptage de mots: Si vous pouvez contrôler les données en cours dans la base de données, vous pouvez supprimer deux espaces avant insertion. Aussi, si vous devez accéder au nombre de mots souvent, vous pouvez calculer une fois dans votre code et stocker le compte dans la base de données.

Autres conseils

MISE À JOUR: Ont maintenant ajouté une réponse distincte pour de MySQL, qui devrait être utilisé de préférence. (Maintenus cette réponse en cas d'être constrainted à l'aide d'une version antérieure.)

Près d'un double de cette question mais cette réponse traitera le cas d'utilisation de compter les mots en fonction de la version avancée du succédané d'expression régulière personnalisée à partir de ce billet de blog .

Démo

Rextester démo en ligne

Pour le texte d'exemple, cela donne un compte de 61 - le même que tous les compteurs de mots en ligne que j'ai essayé (par exemple https :. //wordcounter.net/ )

SQL (à l'exception du code de fonction par souci de concision) :

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 réponse est non, vous ne pouvez pas avoir le même comportement dans MySQL.

Mais je vous recommande extrayez plus tôt question sur le sujet qui lie à une UDF qui permet soi-disant certaines de ces fonctionnalités.

MySQL 8.0 fournit maintenant une bonne regexp_replace fonction, ce qui rend ce beaucoup plus 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;

Démo

démo en ligne DB-Fiddle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top