mysql - MySql - 在while循环中插入表
问题描述
我有一个takes
表,我想将每个成绩记录转换为数值并将其存储在grade_point
表中。
我初始化grade_point
为:
CREATE TABLE IF NOT EXISTS university.grade_point (
id VARCHAR(5),
grade VARCHAR(2),
grade_value NUMERIC(2 , 1)
);
我可以按以下方式解决问题:
id
从takes
表中获取grade
从takes
表中获取如果
grade
是A
那么grade_value
是 4.0如果
grade
是A-
则为grade_value
3.7 ...
我可以编写以下查询:
insert into grade_point(id, grade, grade_value)
SELECT
id,
grade,
CASE
WHEN grade LIKE 'A' THEN 4.0
WHEN grade LIKE 'A-' THEN 3.7
WHEN grade LIKE 'B+' THEN 3.3
WHEN grade LIKE 'B' THEN 3.0
END AS grade_value
FROM
takes;
我想知道我是否可以使用procedure
?
灵感来自公认的解决方案如何循环遍历表的所有行(MySQL):
对于表中的每条
grade
记录takes
选择第
i
th 行获取
id
,grade
并转换grade
为grade_value
将其插入
grade_point
结果是:
delimiter
create procedure update_grade_point()
begin
declare n int default 0
declare i int default 0
select count(grade) from takes into n
set i = 0
while i < n do
insert into grade_point(id, grade, grade_value)
select id, grade,
case
when grade like 'A' then 4.0
when grade like 'A-' then 3.7
when grade like 'B+' then 3.3
when grade like 'B' then 3.0
end as grade_value
from
takes
limit i, 1;
set i = i + 1
end while
end;
delimiter ;
但是,上述查询响应为:
0 行受影响,1 个警告:1050 表 'grade_point' 已存在
当删除grade_point
表并重新执行查询时,我有以下响应
0 行受影响
表中没有插入任何内容grade_point
。
你能告诉我我的遗漏或错误procedure
吗?
问候。
解决方案
我不知道,当一个简单的插入就足够时,你为什么要这样做
但是 ij 一个存储过程,你会使用一个循环
CREATE TABLE IF NOT EXISTS grade_point ( id VARCHAR(5), grade VARCHAR(2), grade_value NUMERIC(2 , 1) );
CREATE TABLE IF NOT EXISTS takes ( id VARCHAR(5), grade VARCHAR(2) );
INSERT INTO takes VALUES ("1","A"),("2","B"),("3","A"),("4","B")
CREATE PROCEDURE update_grade_point ( ) BEGIN DECLARE finished INTEGER DEFAULT 0; DECLARE _grade varchar(2) DEFAULT ""; DECLARE _id varchar(5) DEFAULT ""; -- declare cursor for employee email DEClARE curtakes CURSOR FOR SELECT id,grade FROM takes; -- declare NOT FOUND handler DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; OPEN curtakes; getidGrade: LOOP FETCH curtakes INTO _id,_grade; IF finished = 1 THEN LEAVE getidGrade; END IF; insert into grade_point(id, grade, grade_value) VALUES (_id,_grade, case when grade like 'A' then 4.0 when grade like 'A-' then 3.7 when grade like 'B+' then 3.3 when grade like 'B' then 3.0 end); END LOOP getidGrade; CLOSE curtakes; END
CALL update_grade_point()
SELECT * FROM grade_point
编号 | 等级 | 等级值 :- | :---- | ----------: 1 | 一个 | 4.0 2 | 乙| 3.0 3 | 一个 | 4.0 4 | 乙| 3.0
db<>在这里摆弄
推荐阅读
- pandas - 何时使用 pandas 'loc' 进行数据帧切片
- pdf - 在不破坏使用权的情况下填写 XFA
- javascript - Testcafe 异步函数不在 kafkajs 消费者的 eachMessage 处理程序中运行
- wix - wix msi升级时如何防止json修改
- python - Gunicorn 在 Flask 应用程序的服务器挂钩中因“应用程序对象必须是可调用的”而失败,但前提是作为服务运行
- cplex - 复杂编码。(有向图)
- regex - Kusto 查询以使用正则表达式从消息日志中获取文件扩展名
- sql-server - 防火墙端口从(WAN)接收
- javascript - React Js Carousel Image onclick 播放视频
- javascript - onChange react-select 不调用我的函数