Come contare le parole in MySQL / sostituto di espressioni regolari?

Come posso, in una query MySQL, avere lo stesso comportamento della funzione Regex.Replace (ad esempio in .NET / C #)?

Ne ho bisogno perché, come molte persone, vorrei contare il numero di parole in un campo. Tuttavia, non sono soddisfatto della seguente risposta (data più volte su quel sito):

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

Perché non dà buoni risultati quando c’è più di uno spazio tra due parole.

A proposito, penso che la funzione Regex.Replace possa essere interessante, quindi tutte le buone idee sono ben accette!

    C’è REGEXP_REPLACE disponibile come funzioni definite dall’utente MySQL .

    Conteggio delle parole: se puoi controllare i dati che entrano nel database, puoi rimuovere il doppio spazio prima di inserirlo. Inoltre, se devi accedere spesso al conteggio delle parole, puoi calcolarlo una volta nel tuo codice e memorizzare il conteggio nel database.

    AGGIORNAMENTO: ora ha aggiunto una risposta separata per MySQL 8.0+ , che dovrebbe essere usata di preferenza. (Mantenuta questa risposta in caso di essere costretti a utilizzare una versione precedente.)

    Quasi un duplicato di questa domanda, ma questa risposta affronterà il caso d’uso del conteggio delle parole basato sulla versione avanzata del sostituto dell’espressione regolare personalizzata da questo post del blog .

    dimostrazione

    Demo online di Rextester

    Per il testo di esempio, questo dà un conteggio di 61 – lo stesso di tutti i contatori di parole online che ho provato (ad esempio https://wordcounter.net/ ).

    SQL (escluso il codice funzione per brevità) :

     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; 

    La risposta è no, non è ansible avere lo stesso comportamento in MySQL.

    Ma ti consiglio di controllare questa prima domanda sull’argomento che collega ad una UDF che presumibilmente abilita alcune di queste funzionalità.

    MySQL 8.0 ora offre una decente funzione REGEXP_REPLACE , il che rende molto più semplice:

    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; 

    dimostrazione

    Demo online di DB-Fiddle