MySQL存储过程中用CASE表达式插入变量值至shipin表的问题
解决存储过程中CASE表达式插入失效的问题
嘿,我一眼就看出问题在哪儿啦!你现在的存储过程里,那个单独的Select Case AccountID...语句只是在执行一个独立查询,并没有把它的结果关联到插入shipin表的操作里——你插入时用的还是原始的shipinimport.AccountID作为REFERENCE_2的值,这就是为啥单独查CASE有结果,但插入不生效的原因。
只需要把CASE表达式直接放到INSERT语句的SELECT列表里,替换掉原来的shipinimport.AccountID就行,具体修改后的存储过程代码如下:
CREATE DEFINER=`root`@`%` PROCEDURE `SubjectDetailsExportToShipIn_hs`() BEGIN INSERT INTO ShipInImport SELECT * FROM dpi_timestone.SubjectDetailsView_hs; INSERT INTO `timestone`.`shipin` (`REFERENCE_1`, `REFERENCE_2`, `date_loaded`, `location`) SELECT `shipinimport`.`SubjectKey`, -- Reference 1 -- 把CASE表达式直接放在这里,替换原来的AccountID CASE `shipinimport`.`AccountID` WHEN 16 THEN 191 WHEN 1 THEN 125 -- 可选:加ELSE分支处理其他AccountID的情况,比如返回原ID或者指定默认值 ELSE `shipinimport`.`AccountID` END, -- Reference 2 Now(), -- DateLoaded 'DPI' -- location FROM `dpi_timestone`.`shipinimport`; -- 这个单独的测试查询可以删掉,或者留着验证转换结果用 -- Select Case AccountID When 16 Then 191 When 1 Then 125 End FROM `dpi_timestone`.`shipinimport`; END
关键点说明:
- 核心是把CASE表达式嵌入到INSERT的SELECT字段列表中,这样转换后的值会直接作为
REFERENCE_2插入到目标表 - 建议加上
ELSE分支,避免遇到不在CASE判断范围内的AccountID时插入NULL(如果不需要特殊处理,返回原ID即可) - 你可以先单独执行这个SELECT语句,确认转换后的结果符合预期,再运行存储过程
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

