我有一个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
这是我到目前为止的方法
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以仅搜索和替换该特定摘要段落。 。或类似的语法?
非常感谢
答案 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语句的更多子句更好。