Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用SQL,以高效的方式(使用子字符串、定位和替换、正则表达式等)仅替换大文本字段的一段中的字符串_Mysql_Regex_Replace - Fatal编程技术网

Mysql 使用SQL,以高效的方式(使用子字符串、定位和替换、正则表达式等)仅替换大文本字段的一段中的字符串

Mysql 使用SQL,以高效的方式(使用子字符串、定位和替换、正则表达式等)仅替换大文本字段的一段中的字符串,mysql,regex,replace,Mysql,Regex,Replace,我有一个MySQL数据库,每个记录都有一个包含许多段落的大文本字段 我需要在最后一段中替换一个特定的单词,它总是以“”摘要“ 要替换的特定单词存在于不应替换的其他段落中 文本字段的内容: 第1段:自卫队 dcs fsdf sdf sdf sdf sdf sdf[我的话]sdf sdf 第2段:sdf fg rg dfg dgf[我的话]sdf sdf 自卫队自卫队自卫队自卫队自卫队 第n段:自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫

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

我需要在最后一段中替换一个特定的单词,它总是以“”摘要“

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

文本字段的内容:

第1段:自卫队 dcs fsdf sdf sdf sdf sdf sdf[我的话]sdf sdf

第2段:sdf fg rg dfg dgf[我的话]sdf sdf 自卫队自卫队自卫队自卫队自卫队

第n段:自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队

总结:sdf sdf[我的话]sdf sdf 自卫队自卫队自卫队自卫队自卫队自卫队自卫队自卫队

  • 目标词不存在于每个摘要段落的相同位置
  • 没有一致的分隔符或频率
  • 例如,您不能更改my_word的第5个实例
  • 只需在摘要段落中替换我的单词
这是我目前的做法

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

2) 在摘要段落中添加子字符串。。子字符串(textfield,index\u from\u locate)

3) 在最后一段摘要中替换我的单词。。替换(子字符串“我的单词””,“新文本”)

我可以用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 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]之前的搜索文本部分,2)[new_text],以及3)要替换的[my_word]之后的搜索文本部分

它比这稍微复杂一些,因为您确实希望替换[my_word]的第一个匹配项,而不是“Summary:”之后的匹配项。因此,为了正确地执行此操作,我找到了“Summary:”的位置,然后在该位置之后找到了[my_word]的位置,并执行了两次,一次是在[my_word]之前的concat,一次是在[my_word]之后的concat

注意:这将只替换“Summary:”之后出现的一次[my_word],如果需要替换多次出现的[my_word],则需要采取不同的方法。(或编写脚本多次运行此查询)


注意2:WHERE子句的第二部分
和搜索文本,如“%Summary:%[my\u word]”
非常重要。如果没有它,“Summary%”之后没有[my_word]的行将以一种奇怪的方式更新。此外,由于这可能是一个非常慢的查询,因此可以添加到WHERE语句中的子句越多越好。

为什么不在字段值上运行正则表达式呢?sql不完全支持正则表达式@slnHmmm。。有趣!所以只要测试一下我的单词是否在“Summary”之后就可以了。。那可能有用。只有一个实例,它总是在“Summary;”之后。。。如何使用regex@sin实现这一点?