MySQL / 정규 표현식 교체기에서 단어를 세는 방법은 무엇입니까?
-
20-09-2019 - |
문제
MySQL 쿼리에서 regex.replace 함수 (예 : .NET/C#)와 동일한 동작을 어떻게 가질 수 있습니까?
많은 사람들처럼 필드에서 단어 수를 세고 싶기 때문에 필요합니다. 그러나 나는 다음 답변에 만족하지 않습니다 (해당 사이트에서 여러 번 주어짐) :
SELECT LENGTH(name) - LENGTH(REPLACE(name, ' ', '') +1 FROM table
두 단어 사이에 하나의 공간이 더 많을 때 좋은 결과를 제공하지 않기 때문입니다.
그건 그렇고, Regex.replace 기능이 흥미로울 수 있으므로 모든 좋은 아이디어를 환영합니다!
해결책
regexp_replace를 사용할 수 있습니다 MySQL 사용자 정의 기능.
워드 카운팅 : 데이터베이스에 들어가는 데이터를 제어 할 수 있다면 삽입하기 전에 이중 공백을 제거 할 수 있습니다. 또한 단어 수에 자주 액세스 해야하는 경우 코드에서 한 번 계산하고 데이터베이스에 카운트를 저장할 수 있습니다.
다른 팁
업데이트 : 이제 추가했습니다 MySQL 8.0+에 대한 별도의 답변, 선호하는 경우 사용해야합니다. (이전 버전을 사용하는 것으로 제한된 경우이 답변을 유지했습니다.)
거의 복제 이 질문 그러나이 답변은 사용자 정의 정규 표현식 교체 자의 고급 버전을 기반으로 단어 계산의 사용 사례를 다룰 것입니다. 이 블로그 게시물.
데모
샘플 텍스트의 경우, 이것은 내가 시도한 모든 온라인 단어 카운터와 동일하게 61의 카운트를 제공합니다 (예 : https://wordcounter.net/).
SQL (간결성에 대한 기능 코드 제외):
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;
대답은 MySQL에서 동일한 동작을 가질 수 없다는 것입니다.
그러나 나는 이것을 더 일찍 체크 아웃하는 것이 좋습니다 의문 이 기능 중 일부를 가능하게하는 UDF와 연결되는 주제에 대해.
MySQL 8.0은 이제 괜찮은 것을 제공합니다 regexp_replace 기능으로 훨씬 간단하게 만듭니다.
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;
데모