我有这个MySQL程序,我使用游标:
CREATE DEFINER=`root`@`localhost` PROCEDURE `tax_to_salary`()
BEGIN
DECLARE basic_salary INTEGER;
DECLARE new_salary INTEGER;
DECLARE done INTEGER;
declare count INTEGER;
DECLARE counter INTEGER default 0;
DECLARE cur1 CURSOR FOR SELECT salary FROM employee;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SELECT count(id) INTO count FROM employee;
SET @counter:=0;
OPEN cur1;
l1:LOOP
FETCH cur1 INTO basic_salary;
SET @counter:=@counter+1;
IF @counter>count THEN
leave l1;
end if;
IF basic_salary>2500 THEN
SET @new_salary := 500;
SET @basic_salary := @basic_salary - @new_salary;
else
SET @new_salary := 200;
SET @basic_salary := @basic_salary - @new_salary;
END IF;
SELECT emp_name, salary, basic_salary AS 'Salary after taxes' FROM employee;
END LOOP;
END
我得到了这个结果:
但我的程序应该从超过2500的所有工资中删除500,并从2500以下的工资中删除200。 我试图将最终的SELECT查询放在循环中,但我得到5个标签,每个标签包含下面相同的图像。
答案 0 :(得分:1)
create table employee
( id int auto_increment primary key,
emp_name varchar(100) not null,
salary int not null
);
insert employee (emp_name,salary) values
('John',4400),
('Sarah',2700),
('Peter',2150),
('Ali',2650),
('Ashley',2650);
请注意,您的语言大于2500,而且您说的语言少于2500.但是它的工资条件不等于2500。所以下面是对这个概念的一个修正(否则没有减少)。
最适合许多条件,而不是你的条件
select emp_name,salary,
CASE when salary>=2500 then salary-500
ELSE
salary-200
END as modified_salary
from employee;
+----------+--------+-----------------+
| emp_name | salary | modified_salary |
+----------+--------+-----------------+
| John | 4400 | 3900 |
| Sarah | 2700 | 2200 |
| Peter | 2150 | 1950 |
| Ali | 2650 | 2150 |
| Ashley | 2650 | 2150 |
+----------+--------+-----------------+
对于像你这样的简单条件
select emp_name,salary,
if(salary>=2500,salary-500,salary-200) as modified_salary
from employee;
+----------+--------+-----------------+
| emp_name | salary | modified_salary |
+----------+--------+-----------------+
| John | 4400 | 3900 |
| Sarah | 2700 | 2200 |
| Peter | 2150 | 1950 |
| Ali | 2650 | 2150 |
| Ashley | 2650 | 2150 |
+----------+--------+-----------------+
没有理由按照您的方式使用逐行游标。这就是人们有时会开始使用sql。它们不仅速度慢,而且通常难以忍受,但它们会阻止你利用使sql闪耀的关系的力量。
换句话说,你正在尝试编写过程代码,并通过帮助sql引擎用这种心态来解决这个问题。它不希望这种方式进行优化。你可以,但是你可以放慢速度。
你所说的获得多个标签的原因是你的策略,即使它在数字方面运作良好,每个select语句都会返回一个结果集。通过走危险的光标路线,你返回了其中的五个。