mysql - 如何用MySQL删除列中的特殊字符?

标签 mysql sql mysql-5.0

我参与了一个项目,遇到了别人设计的不好,我们有一个task表,每个task有很多用户,task表如下:

+----------------+---------------+------+-----+---------+-------+
| Field          | Type          | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| id             | varchar(40)   | NO   | PRI | NULL    |       |
| name           | varchar(100)  | YES  |     | NULL    |       |
| task_users     | varchar(1000) | YES  |     | NULL    |       |

并且用户像aaa,bbb,ccc一样存储在task_users列中,这意味着许多用户id被放在一个列中,我知道这是一个非常糟糕的设计但由于这是一个旧项目,我无法修改表格设计。

现在我有一个问题,如果用户被删除了,我如何从task_users列中删除它?

用户id由UUID生成,固定长度32个字符,所以每个用户id都是唯一的,比如40cf5f01eb2f4d2c954412f27b3bf6eb,但问题是用户id可能出现在任意位置task_users 列的,所以我不知道如何删除它

aaa,40cf5f01eb2f4d2c954412f27b3bf6eb,bbb -- in center
40cf5f01eb2f4d2c954412f27b3bf6eb,aaa,bbb -- in head
aaa,bbb,40cf5f01eb2f4d2c954412f27b3bf6eb -- in end

删除用户id后,更新后的结果是这样的

   aaa,bbb

我想知道我们是否可以使用一个更新sql来删除指定的用户id并仍然保持相同的数据格式?

注意:我是在MySQL存储过程中做的,附加变量可能会有帮助,但我还是想只用一个sql来做,MySQL版本是5.0

提前致谢!

最佳答案

我想我们可以用一个查询来做到这一点:

UPDATE yourTable
SET task_users = SUBSTRING(
    REPLACE(CONCAT(',', task_users, ','), CONCAT(',', uid, ','), ','),
    2,
    LENGTH(task_users) - LENGTH(uid) - 1)
WHERE task_users REGEXP CONCAT('[[:<:]]', uid, '[[:>:]]');

enter image description here

这是一个演示链接(用于测试目的):

Demo

这个答案使用了一个技巧,我们将逗号附加到 task_users 字符串的开头和结尾。然后,我们通过在其开头和结尾附加逗号来比较给定的用户 ID。如果找到匹配项,我们只用一个逗号替换。但是,这会使替换仍然保留其开始和结束逗号,因此我们使用子字符串操作删除它们。

抛开 SQL Olympics,希望您能从这些答案的复杂性中看出,在 SQL 数据库中处理 CSV 数据确实令人头疼。也许您甚至可以使用此页面向您的同事证明表格设计需要更改。

关于mysql - 如何用MySQL删除列中的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54121902/

相关文章:

sql - 从每组的第一行和最后一行获取数据

MySQL 插入中选择

mysql - SQL 语法错误 (MYSQL 5.0)

php - 如何在两个日期之间的时间选择一条记录

mysql - SQL Server/MySQL/Access - 以低效的方式加速插入多行

mysql - Sql - 计算每个重复值出现的次数

php - 从用 mysql 5.5 编写的数据库迁移到用 mysql 5.0 编写的数据库

MySql FLOAT 数据类型和超过 7 位数的问题

php - 在 mysql 更新时更改文件

php - 在一定时间间隔后从表中删除数据。比方说(60 分钟)