1

我有一个LONGTEXT用于存储文本段落的列。假设在这些段落中有类似的内容:

Text text text text
COUNT: 75  text text
 text text text text
 text text text text

是否可以对所有文本中的小字符串“COUNT:75”进行比较查询?

我的第一个想法是

SELECT * FROM `books`
WHERE `paragraphs` LIKE '%COUNT: >0%'

这甚至可能吗?

4

1 回答 1

1

SELECT只会找到文本包含通配符之间精确位的行:您不能将 aLIKE与这样的比较逻辑结合起来。

但是,您可以做的是使用正则表达式去除文本的相关部分,然后对其进行分析。

但请记住,结合

  • 大量文本
  • 文本内容逻辑
  • 正则表达式

一下子不会提供最佳性能!我建议如下:

  1. 使用触发器去除文本的一小部分,以便您可以处理一些可管理的内容(即 50 个字符左右),将此子文本插入到单独的表中
  2. 使用 MySql 正则表达式或全文函数来分析您的 COUNT

所以你的触发器会有类似的东西:

select 
ltrim(rtrim(substring(paragraphs, instr(paragraphs, 'count:') + 6, 10)))
from books 
where instr(paragraphs, 'count:') > 0

这将为您提供 之后的下一个 10 个字符'count:',去掉空格。然后你可以通过例如进一步细化它

select substring(text_snippet, 1, instr(text_snippet, ' ')) as count_value
from
(
    select 
    ltrim(rtrim(substring(paragraphs, instr(paragraphs, 'count:') + 6, 10))) 
          as text_snippet
    from books 
    where instr(paragraphs, 'count:') > 0
) x
where isnumeric(substring(text_snippet, 1, instr(text_snippet, ' '))) = 1

获取数字值跟在 COUNT 位之后的行。

然后,您可以提取 COUNT 旁边的数值,将它们作为数字保存在单独的表中,然后像这样使用 JOIN:

select b.*
from books b inner join books_count_values v
on b.id = v.books_id
where v.count_value > 0

看这里

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

供您使用的功能。

于 2012-09-20T06:14:47.340 回答