MySQL更新字段时自动判断空值、逗号追加内容且避免重复的实现方法
单UPDATE语句实现字段追加+去重方案
以下针对不同主流数据库给出实现,所有逻辑均封装在UPDATE语句内,无需额外前置查询。
MySQL 版本(最常用)
核心用FIND_IN_SET函数判断值是否已存在,匹配需求场景的语句示例:
UPDATE users SET genders = CASE WHEN genders IS NULL OR genders = '' THEN 'female' WHEN FIND_IN_SET('female', genders) = 0 THEN CONCAT(genders, ',', 'female') ELSE genders END WHERE id = 1;
逻辑说明
- 场景1:目标行
genders为空,命中第一个分支,直接写入新值,结果为female - 场景2:目标行
genders为male,FIND_IN_SET返回0说明female不存在,命中第二个分支拼接,结果为male,female - 场景3:目标行
genders已包含female,命中ELSE分支保持原值不变,不会生成重复值
注意事项
- 替换语句中的
female为你实际要追加的新值 - 替换
WHERE id = 1为你实际的行筛选条件 - 如果你的业务中空值仅为NULL,没有空字符串的情况,可以删除
OR genders = ''的判断
PostgreSQL 版本
用正则匹配避免部分值误判,语句示例:
UPDATE users SET genders = CASE WHEN genders IS NULL OR genders = '' THEN 'female' WHEN genders !~ CONCAT('(^|,)', 'female', '(,|$)') THEN CONCAT(genders, ',', 'female') ELSE genders END WHERE id = 1;
SQL Server 版本
用CHARINDEX加前后补逗号的方式判断值是否存在,语句示例:
UPDATE users SET genders = CASE WHEN genders IS NULL OR genders = '' THEN 'female' WHEN CHARINDEX(',' + 'female' + ',', ',' + genders + ',') = 0 THEN CONCAT(genders, ',', 'female') ELSE genders END WHERE id = 1;
内容的提问来源于stack exchange,提问作者Relaxing Music
相关产品推荐
相关产品推荐

