2009-11-18 16 views
16

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

Ho bisogno di questo perché, come molte persone, vorrei contare il numero di parole in un campo. Tuttavia, non sono soddisfatti della risposta che segue (dato più volte su quel sito):

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

Perché non dà buoni risultati quando ci sono più che uno spazio tra due parole.

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

+0

Per curiosità, perché contare le parole in un campo? – Peter

risposta

17

C'è REGEXP_REPLACE disponibile come MySQL user-defined functions.

Conteggio delle parole: se è possibile controllare i dati inseriti nel database, è possibile rimuovere doppio spazio bianco 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.

+0

scusa per accettare così tardi ... – PierrOz

0

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

Ma vi consiglio di controllare questo precedente question sull'argomento che collega ad una UDF che presumibilmente abilita alcune di queste funzionalità.

1

Quasi un duplicato di this question ma questa risposta risolverà il caso d'uso del conteggio delle parole basato sulla versione avanzata del sostituto dell'espressione regolare personalizzata da this blog post.

Demo

Rextester online demo

Per il testo di esempio, questo dà un conteggio di 61 - lo stesso di tutti i contatori di parola in linea 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 (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; 
Problemi correlati