문제

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;

데모

DB-Fiddle Online 데모

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top