我有一个MySQL数据库,其中的每条记录都有一个带有许多段落的大文本字段。

我只需要在最后一段中替换一个特定的词,该词始终以“摘要:”开头

其他段落中存在要替换的特定单词,不应替换!

文本字段的内容:


  第1段:sdf,sdf,sdf,sdf,sdf,sdf
  dcs fsdf sdf sdf sdf sdf [my_word] sdf sdf
  
  第2段:sdf fg rg dfg dgf [my_word] sdf sdf sdf
  sdf sdf sdf sdf sdf sdf sdf sdf sdf s
  
  N段:sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdfdf gdfg
  
  摘要:sdf sdf [my_word] sdf sdf sdf sdf
  sdf sdf sdf sdsdfsdf sdf sdf sdf sdf sdf sdf



在每个摘要段落中,目标词并不存在于相同的位置。
没有一致的定界符或频率。
例如,您不能更改my_word的第5个实例。
只需要在摘要段落中替换my_word


到目前为止,这是我的方法

1)在文本字段中找到“摘要:”并获取其索引号。LOCATE('Summary:',textfield)from mytable

2)SUBSTRING摘要段落。SUBSTRING(textfield,index_from_locate)

3)在最后一个摘要段落中替换my_word。.REPLACE(子字符串,'my_word','new_text')

我可以使用Selects从这三个单独的语句中获得良好的结果。但是我很难将它们全部合并到有效运行的实际表/字段的更新中,例如...

UPDATE myTable SET textfield = REPLACE((SELECT SUBSTRING(textfield, (SELECT LOCATE('Summary:',textfield)) ) FROM myTable WHERE created BETWEEN '2015-06-01 00:00:00' AND '2015-07-05 23:59:59'),'my_word','my_new_word')


我将如何使用locate / substring / replace编写一个UPDATE来仅搜索和替换特定的摘要段落。 。或类似的语法?

非常感谢

最佳答案

我知道这个问题有点老了,但是尝试一下:

UPDATE test SET search_text = CONCAT(
  CONCAT(
    SUBSTRING(search_text FROM 1 FOR (
      LOCATE('[my_word]',search_text,LOCATE('Summary:',search_text))-1)
      ),'[new_text]'
  ),SUBSTRING(search_text FROM
    (LOCATE('[my_word]',search_text,LOCATE('Summary:',search_text))+CHAR_LENGTH('[my_word]')))
  )
WHERE created BETWEEN '2015-06-01 00:00:00' AND '2015-07-05 23:59:59'
AND search_text LIKE '%Summary:%[my_word]%'


(哇,很难格式化!)

基本上,它的工作是将3个字符串连接起来:1)您要替换的[my_word]之前的search_text部分,2)[new_text],以及3)您想要的[my_word]之后的search_text部分取代。

这样做比这稍微复杂一点,因为您确实要替换[my_word]的第一个匹配项,而不是'Summary:'之后的匹配项。因此,要正确执行此操作,我会找到“摘要:”的位置,然后在该位置之后找到[my_word]的位置-并执行两次,一次是在[my_word]之前的concat,一次是在之后的concat。

注意:这只会替换“摘要:”之后的一个[my_word]实例,如果您需要替换多个实例,则需要采用其他方法。 (或编写脚本以多次运行此查询)。

注意2:WHERE子句AND search_text LIKE '%Summary:%[my_word]%'的第二部分非常重要。如果没有它,则以“ Summary%”之后没有[my_word]的行将以一种奇怪的方式进行更新。另外,由于这可能是一个非常慢的查询,因此可以将更多的子句添加到WHERE语句中会更好。

关于mysql - 使用SQL,以一种高性能的方式(仅使用Substring,Locate and Replace,RegEx等)替换大文本字段的一个段落中的字符串。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34121232/

10-10 19:35