在mySQL中为列的每一行添加子字符串

在mySQL中为列的每一行添加子字符串,mysql,Mysql,我有一个表,它有一个名为menu|name的列,其中包含一个类似“one | two | three | four | something”的字符串 我想写一个一次性的脚本,将删除所有后,包括最后一个| 所以最终的值是“一|二|三|四” 如果单元格中没有|,即“某物”,则我要将字符串设置为“” 谢谢 感谢Nanhe Kumar让我靠近,这里是最后的命令: UPDATE reports SET menu_name = SUBSTRING(menu_name,1,POSITION(substring

我有一个表,它有一个名为menu|name的列,其中包含一个类似“one | two | three | four | something”的字符串

我想写一个一次性的脚本,将删除所有后,包括最后一个|

所以最终的值是“一|二|三|四”

如果单元格中没有|,即“某物”,则我要将字符串设置为“”

谢谢

感谢Nanhe Kumar让我靠近,这里是最后的命令:

UPDATE reports SET menu_name = SUBSTRING(menu_name,1,POSITION(substring_index(menu_name,'|',-1) IN menu_name)-2)
您可以使用该函数执行此操作

select substring_index(menu_name, '|', 4) from my_table;
要在分隔符不存在的情况下返回空字符串,可以执行稍微复杂的选择:

select if (menu_name like '%|%|%|%|%', substring_index(menu_name, '|', 4), '') 
from my_table;

这里有一个SQLFIDLE来演示:

我应该提到,行中可以有任意数量的|,因此可以是“一|二”或“一|二|三”等,这使得它变得更加困难。但真正的问题是,为什么有一个表违反了第一范式?你应该集中精力正确地设计你的表,这样你就不会遇到这样的问题。我没有设计这个表,我只是想解决一些遗留问题。我们使用该字段存储一种平面文件结构,其中文件夹由管道分隔。不幸的是,他们将“文件”的名称作为最后一个值。但我们也将文件名存储在其中一列中,因此不需要将其保存在路径中
SELECT SUBSTRING(menu_name,1,POSITION(substring_index(menu_name,'|',-1) IN menu_name)-2) AS menu FROM table_name;