MySQL:修改INSERT SELECT语句中选中字段插入值的方法
解决CASE表达式替换AccountID插入的语法问题
你的思路完全没问题,用CASE表达式做条件值替换是正确的方向,问题出在修改后的SQL里SELECT子句的顺序和内容错误——你把原AccountID和CASE表达式同时放在了查询列表里,导致返回的字段数量和INSERT目标字段不匹配,而且CASE的位置也没对应到REFERENCE_2的位置上。
错误原因拆解
原INSERT语句中,REFERENCE_2对应的是shipinimport.AccountID,你需要直接把这个字段替换成CASE处理后的结果,而不是在后面额外加一个CASE表达式。这样的错误会让SELECT返回5个字段,但INSERT只接收4个,自然会触发语法或字段不匹配的报错。
修正后的SQL语句
INSERT INTO `timestone`.`shipin` (`REFERENCE_1`, `REFERENCE_2`, `date_loaded`, `location`) SELECT `shipinimport`.`SubjectKey`, -- Reference 1 -- 用CASE替换原AccountID,作为REFERENCE_2的插入值 CASE `shipinimport`.`AccountID` WHEN 16 THEN 191 WHEN 1 THEN 125 -- 可选:如果有其他AccountID值,可添加ELSE指定默认行为,比如保留原数值或设为NULL -- ELSE `shipinimport`.`AccountID` END, Now(), -- DateLoaded 'DPI' -- location FROM `dpi_timestone`.`shipinimport`;
额外提示
- 如果遇到AccountID既不是1也不是16的情况,上面的语句会给
REFERENCE_2插入NULL,要是想保留原数值,加上ELSEshipinimport.AccountID``这一行即可。 - 可以给CASE表达式加别名(比如
END AS REFERENCE_2),提升代码可读性,避免字段名混乱。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

