Frage

Wie kann ich in einer MySQL-Abfrage, habe das gleiche Verhalten wie die Regex.Replace Funktion (zum Beispiel in .NET / C #)?

Ich brauche das, weil so viele Menschen, würde Ich mag die Anzahl der Worte in einem Feld zählen. Allerdings bin ich nicht mit der folgenden Antwort zufrieden (mehrmals auf dieser Website angegeben):

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

Weil es keine guten Ergebnisse nicht geben, wenn es mehr, dass ein Leerzeichen zwischen zwei Worten ist.

By the way, ich denke, die Regex.Replace Funktion interessant sein kann, so dass alle die guten Ideen sind willkommen!

War es hilfreich?

Lösung

Es gibt REGEXP_REPLACE als MySQL benutzerdefinierte Funktionen .

Wortzählung: Wenn Sie die Daten gehen in die Datenbank steuern kann, können Sie doppelte Leerzeichen entfernen, bevor Einsatz. Auch wenn Sie häufig die Wortzahl für den Zugriff haben, können Sie es einmal in Ihrem Code berechnen und die Zählung in der Datenbank speichern.

Andere Tipps

UPDATE: Habe jetzt hinzugefügt eine separate Lösung für MySQL 8.0+ , die bevorzugt verwendet werden soll. (Retained diese Antwort bei der Verwendung einer früheren Version constrainted werden.)

Fast ein Duplikat diese Frage aber diese Antwort wird den Anwendungsfall des Zählens Wörter basierend auf der erweiterten Version des benutzerdefinierten regulären Ausdruck replacer von dieses Blog-Post .

Demo

Rextester Online-Demo

Für den Beispieltext, das gibt eine Anzahl von 61 - das gleiche wie alle Online-Wortzähler Ich habe versucht (zB https :. //wordcounter.net/ )

SQL (ohne Funktionscode der Kürze halber) :

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;

Die Antwort ist nein kann man nicht das gleiche Verhalten in MySQL hat.

Aber ich empfehlen Sie Prüfung dieses früher Frage zum Thema ermöglicht.

MySQL 8.0 bietet jetzt eine anständige REGEXP_REPLACE Funktion, die diese viel einfacher macht:

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;

Demo

DB-Fiddle Online-Demo

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top