这看起来应该很简单,但经过几周的观察,我找不到答案。
我正在尝试删除不再需要的字符串。 Regex_replace听起来很完美,但在MySQL中不可用。
在MySQL中我将如何完成更改:
[报价= ABC; XXXXXX]
到此: [引用= ABC]
问题是: - 这可以出现在文本blob中的任何位置 - xxxxxx只能是数字,但长度可以是6,7或8个字符 - 不添加/删除任何行,只需一次重写一行中一列的内容。
感谢。
答案 0 :(得分:0)
我认为你真的不需要REGEX_Replace(虽然它会让事情变得更容易)。
假设您提供的示例真实地反映了您拥有的内容:
您的起点是字符串[quote=<something>;
,这意味着您可以开始搜索[quote=
,
找到后,您需要搜索;
,然后搜索]
,
一旦找到它们,你知道在下一次搜索的开始时提取什么(如果你提到的模式在单个blob中出现多次。
我找到你了吗?
修改强>
此范例旨在根据以下假设将[quote=ABC;xxxxxx]
的所有实例转换为[quote=ABC]
:
模式可以在输入字符串中出现任意次,
xxxxxx
的长度不固定,
结果字符串(在删除;xxxxxx
的所有外观之后)应替换表中的值,
性能不是问题,因为这将是一次性工作(通过整个表),或者每次都会在一个字符串上运行(例如,在插入新记录之前)。
将使用的一些MySQL函数:
INSTR
:在字符串中搜索子字符串的第一个外观,并返回找到子字符串的位置(偏移量),
SUBSTR
:从字符串返回一个子字符串(使用它的几种方法),
CONCAT
:连接两个或多个字符串。
此处介绍的指南适用于操作单个INPUT字符串。如果需要在整个表上使用它,只需将字符串放入CURSOR并循环。
以下是步骤:
声明五个INT局部变量作为索引和总输入字符串长度,比如L_Start,L_UpTo,l_Total_Length,l_temp1和l_temp 2,设置l_Start = 1和l_Total_Length = LENGTH(INPUT_String)的初始值,< / p>
声明一个字符串变量,您将在其中复制&#34; clean&#34;结果并将其作为''
启动,例如l_Output_str;还声明一个临时字符串来保存'ABD'
的值,比如l_Quote,
启动无限循环(您将在其中设置退出条件;请参阅下文),
如果l_Start&gt; = l_Total_Length退出循环(此处是循环中两个退出点之一),
从L_Start开始,在输入字符串中查找'[quote='
的第一个位置,
如果返回的值为0(即未找到子字符串),则将l_Output_str的当前内容与位置L_start(例如SET l_Output_str = CONCAT(l_Output_str,SUBSTR(INPUT_String,L_Start) ;
)的输入字符串(例如;
)和退出循环(第二个退出位置)中的任何剩余部分连接起来),
在输入字符串中搜索从{L_start + 7开始的[quote=
符号(即]
的长度)并将值保存在l_temp_1中,
从L_start + 7 + l_temp2开始搜索输入字符串中的SET l_Output_str = CONCAT(l_Output_str,'[quote=',SUBSTR(INPUT_String,L_Start + 7, l_temp_2 - l_temp_1),']') ;
符号,并将值保存在l_temp_2中,
将找到的结果添加到输出字符串{{1}},
设置L_Start = L_Start + 7 + l_temp_2 + 1;
循环结束。
注意:
由于我既没有制作代码也没有对其进行测试,因此我可能没有正确设置索引;您需要执行详细的测试,以使其按需运行;
以上 IS 我建议的方法;
如果输入字符串很长(很多MB),由于连接,您可能会发现性能不佳(即可能需要几秒钟才能完成)。可以采取一些措施来提高性能,但让我们首先使用它,然后在需要时解决性能问题。
希望以上内容清晰而全面。