如何在MySQL字符串中提取第n个单词并计算单词出现次数?

Noa*_*oam 58 regex mysql word-count

我想有一个像这样的mysql查询:

select <second word in text> word, count(*) from table group by word;
Run Code Online (Sandbox Code Playgroud)

mysql中的所有正则表达式示例用于查询文本是否与表达式匹配,但不用于从表达式中提取文本.有这样的语法吗?

Bre*_*len 45

以下是针对OP 特定问题(提取字符串的第二个字)的建议解决方案,但应该注意的是,正如mc0e的答案所述,实际提取正则表达式匹配在MySQL中不支持开箱即用.如果你真的需要这个,那么你的选择基本上是1)在客户端上进行后处理,或2)安装MySQL扩展来支持它.


BenWells几乎是正确的.根据他的代码,这是一个稍微调整的版本:

SUBSTRING(
  sentence,
  LOCATE(' ', sentence) + CHAR_LENGTH(' '),
  LOCATE(' ', sentence,
  ( LOCATE(' ', sentence) + 1 ) - ( LOCATE(' ', sentence) + CHAR_LENGTH(' ') )
)
Run Code Online (Sandbox Code Playgroud)

作为一个工作示例,我使用了:

SELECT SUBSTRING(
  sentence,
  LOCATE(' ', sentence) + CHAR_LENGTH(' '),
  LOCATE(' ', sentence,
  ( LOCATE(' ', sentence) + 1 ) - ( LOCATE(' ', sentence) + CHAR_LENGTH(' ') )
) as string
FROM (SELECT 'THIS IS A TEST' AS sentence) temp
Run Code Online (Sandbox Code Playgroud)

这成功地提取了这个词 IS

  • 是的我错过了句子引用和+1定位.我并不为"接受的答案"烦恼,我只想帮助他. (12认同)
  • 我同意@HypolitePetovan,这个答案稍微不正确,因为它返回3个字符而不是2.它也定位不正确.我建议编辑包括添加CHAR_LENGTH以正确定位并确定正确的长度.使用空格时很难但在整个选择上运行CHAR_LENGTH会显示它返回3个字符 (2认同)

小智 27

提取句子中第二个单词的较短选项:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('THIS IS A TEST', ' ',  2), ' ', -1) as FoundText
Run Code Online (Sandbox Code Playgroud)

用于SUBSTRING_INDEX的MySQL文档


Ben*_*lls 14

根据http://dev.mysql.com/,SUBSTRING函数使用起始位置然后长度,所以第二个单词的函数肯定是:

SUBSTRING(sentence,LOCATE(' ',sentence),(LOCATE(' ',LOCATE(' ',sentence))-LOCATE(' ',sentence)))
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 7

不,没有使用正则表达式提取文本的语法.您必须使用普通的字符串操作函数.

或者,从数据库中选择整个值(如果您担心过多的数据传输,则选择前n个字符),然后在客户端上使用正则表达式.


mc0*_*c0e 5

正如其他人所说,mysql不提供用于提取子字符串的正则表达式工具.如果您准备使用用户定义的函数扩展mysql,那并不是说你不能拥有它们:

https://github.com/mysqludf/lib_mysqludf_preg

如果你想分发你的软件,这可能没有多大帮助,这是安装你的软件的障碍,但对于内部解决方案,这可能是合适的.


Hyp*_*van 5

我使用Brendan Bullen的答案作为我遇到的类似问题的起点,即在JSON字符串中检索特定字段的值.但是,就像我评论他的回答一样,这并不完全准确.如果您的左边界不仅仅是原始问题中的空间,那么差异会增加.

纠正解决方案:

SUBSTRING(
    sentence,
    LOCATE(' ', sentence) + 1,
    LOCATE(' ', sentence, (LOCATE(' ', sentence) + 1)) - LOCATE(' ', sentence) - 1
)
Run Code Online (Sandbox Code Playgroud)

两个差异是SUBSTRING索引参数中的+1和长度参数中的-1.

对于"找到两个提供的边界之间的字符串的第一次出现"的更一般的解决方案:

SUBSTRING(
    haystack,
    LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>'),
    LOCATE(
        '<rightBoundary>',
        haystack,
        LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>')
    )
    - (LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>'))
)
Run Code Online (Sandbox Code Playgroud)


小智 2

我认为这样的事情是不可能的。您可以使用SUBSTRING函数来提取您想要的部分。