我有两个varchar列的表-col\u name1和col\u name2
(1, 'hello world', 'hello test'),
(2, 'the stack over', 'over the flow'),
(3, 'hello from my sql fiddle', 'hello my sql');
请参见sqlfiddlehttp://sqlfiddle.com/#!9/cf90c1/1型
我正在寻找一种方法,在两列中找到重复的单词,并从col\u name1中删除这些单词。
这意味着在mysql操作+update+set之后-col\u name1应该包含如下单词
(1, 'world', 'hello test'),
(2, 'stack', 'over the flow'),
(3, 'from fiddle', 'hello my sql');
2条答案
按热度按时间lp0sw83n1#
如果您使用的是mysql 8.0,那么可以使用递归公共表表达式(recursive common table expressions,cte)对字符串进行迭代以查找所有单词。下面的update语句应该可以完成这项工作:
此update语句使用多个CTE:
单词边界:标识每个单词的开始和停止位置
单词:col\u name1中的所有单词
唯一单词:对应列名称2中不存在的所有单词
new\u text:通过连接每个行id的唯一\u单词中的所有单词来生成新的列值
如果字符串可能包含超过1000个空格字符,则必须增加cte\u max\u recursion\u depth的值。将table_name.id定义为主键可以在表较大时加快速度。
我认为这个例子展示了CTE在将复杂任务分解为简单步骤方面是多么有用。
vddsk6oq2#
以下是解决问题的方法:
解决问题的sql语句:
下面是从示例数据到预期输出的示例:
希望它能解决你的问题。祝你一切顺利!!!
编辑-根据问题所有者的要求:处理大量单词。现在它可以处理多达10000个单词