使用SQL,以高性能方式仅在大文本字段的一个段落中替换字符串(使用子字符串,定位和替换,RegEx,等等)

时间:2015-12-06 18:46:39

标签: mysql regex replace

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

我需要替换最后一段中的特定单词,该单词始终以"摘要:"

开头

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

文字字段的内容:

  

第1段:sdf 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 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('摘要:',textfield)FROM mytable

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

3)在最后一个摘要段落中替换my_word .. REPLACE(substring,' my_word ',' new_text')

我可以通过选择这三个单独的语句获得良好的结果..但是我无法将它们全部放在一起更新有效运行的实际表/字段,例如...

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以仅搜索和替换该特定摘要段落。 。或类似的语法?

非常感谢

1 个答案:

答案 0 :(得分:0)

我知道这个问题有点陈旧,但试试这个:

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:'之后的出现。所以为了正确地做到这一点,我找到了'Summary:'的位置,然后找到了[my_word]在该位置之后的位置 - 并且执行了两次,一次用于[my_word]之前的concat,一次用于之后的concat。

注意:这只会在“摘要:”之后替换一个出现的[my_word],如果您需要替换多次出现,那么您需要取一个不同的方法。 (或者编写一个脚本来多次运行此查询)。

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