当前位置 : 首页 » 互动问答 » 正文

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

分类 : 互动问答 | 发布时间 : 2010-10-26 15:24:34 | 评论 : 9 | 浏览 : 105093 | 喜欢 : 58

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

选择<text in text> word,count(*)from table by word;

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

回答(9)

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


    BenWells几乎是正确的。从他的代码开始,这是一个稍微调整过的版本:

     SUBSTRING(
      句子,
      LOCATE('',句子)+ CHAR_LENGTH(''),
      LOCATE('',句子,
      (LOCATE('',句子)+ 1) - (LOCATE('',句子)+ CHAR_LENGTH(''))
    )
    

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

     SELECT SUBSTRING(
      句子,
      LOCATE('',句子)+ CHAR_LENGTH(''),
      LOCATE('',句子,
      (LOCATE('',句子)+ 1) - (LOCATE('',句子)+ CHAR_LENGTH(''))
    )作为字符串
    从(选择'这是一个测试'作为句子)临时
    

    这成功地提取了这个词IS

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

     SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('这是一个测试','',2),'', -  1)作为FoundText
    

    SUBSTRING_INDEX的MySQL文档

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

     SUBSTRING(句子,LOCATE('',句子),(LOCATE('',LOCATE('',句子)) -  LOCATE('',sentence)))
  • 4楼
  • 不,没有使用正则表达式提取文本的语法。您必须使用普通的字符串操作函数.

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

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

    https://github.com/mysqludf/lib_mysqludf_preg

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

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

    更正的解决方案:

     SUBSTRING(
        句子,
        LOCATE('',句子)+ 1,
        LOCATE('',句子,(LOCATE('',句子)+ 1)) -  LOCATE('',句子) -  1
    )
    

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

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

     SUBSTRING(
        草垛,
        LOCATE('<leftBoundary>',haystack)+ CHAR_LENGTH('<leftBoundary>'),
        定位(
            '<rightBoundary>',
            草垛,
            LOCATE('<leftBoundary>',haystack)+ CHAR_LENGTH('<leftBoundary>')
        )
         - (LOCATE('<leftBoundary>',haystack)+ CHAR_LENGTH('<leftBoundary>'))
    )
  • 7楼
  • 我不认为这样的事情是可能的。您可以使用子字符串函数来提取所需的部分。

  • 8楼
  • My 本地正则表达式替换函数可以用于此。

    Demo

    See 此DB -reiddle demo ,它返回着名十四行诗中的第二个单词(“I”)及其出现次数(1)。

    SQL

    假设正在使用MySQL 8或更高版本(允许使用 Common Table Expression ),以下内容将返回第二个单词及其出现次数:

     WITH cte AS(
         SELECT digits.idx,
                SUBSTRING_INDEX(SUBSTRING_INDEX(words,'〜',digits.idx + 1),'〜', -  1)字
         从
         (SELECT reg_replace(UPPER(txt),
                             '[^''” A-ZA-Z  - ] +”,
                             '〜',
                             真正,
                             1,
                             0)AS单词
          FROM tbl)分隔
         内部联接
         (SELECT @row:= @row + 1作为idx FROM
          (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9)t1,
          (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9)t2,
          (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9)t3,
          (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9)t4,
          (SELECT @row:= -1)t5)数字
         ON LENGTH(REPLACE(words,'〜',''))<= LENGTH(words) -  digits.idx)
    SELECT c.word,
           subq.occurrences
    来自cte c
    LEFT JOIN(
      选词,
             发生COUNT(*)AS
      来自cte
      GROUP BY字
    )subq
    ON c.word = subq.word
    WHERE idx = 1; / * idx从零开始,所以1这里得到第二个字* /
    

    解释

    上面的SQL中使用了一些技巧,需要一些认证。首先,正则表达式替换器用于替换所有连续的非单词字符块 - 每个字符由单个tilda(~)字符替换。 注意:如果文本中出现tilda的可能性,则可以选择不同的字符。

    然后使用此答案中的技术将带有分隔值的字符串转换为单独的行值。它与此答案中的聪明技术相结合,用于生成一个由递增数字序列组成的表:在这种情况下为0 - 10,000。

  • 9楼
  • 该字段的值为:

    “ -  DE-HEB 20% -  DTopTen 1.2%”
    选择 ....
    SUBSTRING_INDEX(SUBSTRING_INDEX(DesctosAplicados,'DE-HEB', -  1),' - ',1)DE-HEB,
    SUBSTRING_INDEX(SUBSTRING_INDEX(DesctosAplicados,'DTopTen', -  1),' - ',1)DTopTen,
    
    来自TABLA
    

    Result is:

     DE-HEB DTopTEn
        20%1.2%

相关阅读:

MySQL's now() +1 day

What is the best regular expression to check if a string is a valid URL?

Check whether a string matches a regex in JS

MySQL date format DD/MM/YYYY select query?

Multiple select statements in Single query

deny direct access to a folder and file by htaccess

How to access remote server with local phpMyAdmin client?

Grant **all** privileges on database

Match the path of a URL, minus the filename extension

How to get a list of MySQL user accounts