我有一个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/