我有一个具有以下结构的数据库:
+----+----+-------------------+---------------+ | id | by | name | list | +----+----+-------------------+---------------+ | 1 | 1 | FirstName | 12,6,5,3,2,66 | +----+----+-------------------+---------------+ | 2 | 1 | SecondName | 6,3,5 | +----+----+-------------------+---------------+
我需要做的是从list
列中删除某个数字,例如“6”数字(table
可能包含数千行包含特定列表ID的行需要删除)。
我尝试了以下几乎可以工作的查询,它可以删除'6'条目,但它也会剥离66并且可以留下一个空列表元素(例如:,, 3,2):
UPDATE `table` SET `list` = REPLACE ( `list`, '6', '' ) WHERE find_in_set('6', list);
遗憾的是,我无法使用任何外部库(如preg_replace),也无法重构数据库,有没有办法做到这一点?
答案 0 :(得分:0)
如果你不能重组并且需要忍受这种憎恶,我认真地建议你不要接受这份工作。
那就是说,你需要区分3个案例:
所以你需要三个查询
UPDATE `table` SET `list`=RIGHT(`list`,CHAR_LENGTH(`list`)-2) WHERE `list` LIKE '6,%';
UPDATE `table` SET `list`=LEFT(`list`,CHAR_LENGTH(`list`)-2) WHERE `list` LIKE '%,6';
UPDATE `table` SET `list`=REPLACE(`list`,',6,','') WHERE `list` LIKE '%,6,%';
注意常数2
- 它仅对单个数字有效。为了普遍使用CHAR_LENGTH("6")+1
答案 1 :(得分:0)
有一种方法可以使用一个更新语句执行此操作。亵渎神明的想法是用空格替换逗号,这样你就可以使用ltrim()
和rtrim()
:
update table t
set list = replace(ltrim(rtrim(replace(concat(' ', replace(list, ',', ' '), ' '), ' 6 ', ' '))), ' ', ',')
where find_in_set('6', list) > 0;
步骤如下:
' 6 '
。这将删除列表中的任何位置。ltrim()
和rtrim()
删除字符串开头和结尾的空格。