如何用Table2字段值更新Table1?SQL UPDATE语句报错求助
正确实现逗号分隔字段匹配的更新操作
这问题我太熟了,逗号存多值的字段确实容易踩坑!你的原语句没生效大概率是两个原因:字符串拼接的语法不对,或者模糊匹配的精度有问题(比如会误匹配包含目标nodeid的更长数字)。下面分常见数据库给你靠谱的解决方案:
先说说原语句的问题
- 字符串拼接语法差异:不同数据库的字符串拼接方式不一样,比如你用的
'%'+t2.nodeid+'%',在MySQL里会把数字类型的nodeid和字符串做数值运算(结果肯定不对),得用专门的字符串拼接函数; - 模糊匹配的误判:比如如果Table2里有个nodeid是
227741593,Table1的node里有2277415937,LIKE '%227741593%'会错误匹配,没法精准定位逗号分隔的单个项。
解决方案
1. MySQL 环境(推荐用FIND_IN_SET)
MySQL自带的FIND_IN_SET()函数就是专门用来处理逗号分隔的列表的,能精准判断某个值是否在列表里:
UPDATE table1 t1 INNER JOIN table2 t2 ON FIND_IN_SET(t2.nodeid, t1.node) > 0 SET t1.name = t2.name;
FIND_IN_SET(str, strlist)会返回str在strlist中的位置,返回值>0就说明存在,完美避免部分匹配的问题。
2. SQL Server 环境
版本2016及以上(用STRING_SPLIT拆分)
SQL Server 2016以后支持STRING_SPLIT(),可以把逗号分隔的字段拆成单独的行,再做精准关联:
UPDATE t1 SET t1.name = t2.name FROM table1 t1 INNER JOIN table2 t2 ON EXISTS ( SELECT 1 FROM STRING_SPLIT(t1.node, ',') AS split_nodes WHERE split_nodes.value = CAST(t2.nodeid AS VARCHAR(20)) );
这里把nodeid转成字符串是为了和拆分后的value类型匹配,避免类型转换错误。
版本2016以下(用前后加逗号的LIKE)
如果是老版本,没有STRING_SPLIT,可以给node字段前后都加上逗号,再做模糊匹配,确保匹配的是完整的项:
UPDATE t1 SET t1.name = t2.name FROM table1 t1 INNER JOIN table2 t2 ON ',' + t1.node + ',' LIKE '%,' + CAST(t2.nodeid AS VARCHAR(20)) + ',%';
比如原来的2277415921,2277415917会变成,2277415921,2277415917,,匹配的时候找,2277415937,,这样就不会误匹配类似22774159371的项了。
内容的提问来源于stack exchange,提问作者Radim
相关产品推荐
相关产品推荐

