用for循环替换多个"select"
Replace multiple "select" with for loop
CREATE TABLE tab_1 (
t1 decimal (10),
t2 decimal (10),
t3 decimal (10)
);
INSERT INTO tab_1 (t1, t2, t3) VALUES ( 1, -2, -5);
INSERT INTO tab_1 (t1, t2, t3) VALUES (-3, 4, 6);
INSERT INTO tab_1 (t1, t2, t3) VALUES ( 5, 1, 2);
SELECT sum(t1) FROM tab_1 WHERE t1 > 0;
SELECT sum(t2) FROM tab_1 WHERE t2 > 0;
SELECT sum(t2) FROM tab_1 WHERE t3 > 0;`
我有一个类似上面的查询,我需要一个可以用 for i=1:3
替换三个 select
的脚本
输出必须是这样的:
Q_total:
6
5
8
谢谢!
我用MYSQLWorkbench6.3.7
您必须为此使用 Procedure
DELIMITER $$
CREATE PROCEDURE ABC()
BEGIN
DECLARE a INT Default 1 ;
simple_loop: LOOP
SELECT sum(t@a) FROM tab_@a WHERE t@a > 0;
SET a=a+1;
IF a=4 THEN
LEAVE simple_loop;
END IF;
END LOOP simple_loop;
END $$
调用该存储过程使用
CALL `ABC`()
为什么需要在函数中执行此操作?您要查找的结果可以通过单个查询给出。
SELECT SUM(CASE WHEN t1 > 0 THEN t1 ELSE 0 END) AS t1Sum,
SUM(CASE WHEN t2 > 0 THEN t2 ELSE 0 END) AS t2Sum,
SUM(CASE WHEN t3 > 0 THEN t3 ELSE 0 END) AS t3Sum
FROM tab_1
您可以在 INFORMATION_SCHEMA.COLUMNS
和 PREPARE statement
的帮助下实现此目的
SET @sql := '';
SELECT
GROUP_CONCAT('SELECT SUM(',COLUMN_NAME,') FROM tab_1 WHERE ',COLUMN_NAME, ' > 0' SEPARATOR ' UNION ALL ') INTO @sql
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA ='your_database_name'
AND TABLE_NAME ='your_table_name';
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE stmt;
CREATE TABLE tab_1 (
t1 decimal (10),
t2 decimal (10),
t3 decimal (10)
);
INSERT INTO tab_1 (t1, t2, t3) VALUES ( 1, -2, -5);
INSERT INTO tab_1 (t1, t2, t3) VALUES (-3, 4, 6);
INSERT INTO tab_1 (t1, t2, t3) VALUES ( 5, 1, 2);
SELECT sum(t1) FROM tab_1 WHERE t1 > 0;
SELECT sum(t2) FROM tab_1 WHERE t2 > 0;
SELECT sum(t2) FROM tab_1 WHERE t3 > 0;`
我有一个类似上面的查询,我需要一个可以用 for i=1:3
select
的脚本
输出必须是这样的:
Q_total:
6
5
8
谢谢!
我用MYSQLWorkbench6.3.7
您必须为此使用 Procedure
DELIMITER $$
CREATE PROCEDURE ABC()
BEGIN
DECLARE a INT Default 1 ;
simple_loop: LOOP
SELECT sum(t@a) FROM tab_@a WHERE t@a > 0;
SET a=a+1;
IF a=4 THEN
LEAVE simple_loop;
END IF;
END LOOP simple_loop;
END $$
调用该存储过程使用
CALL `ABC`()
为什么需要在函数中执行此操作?您要查找的结果可以通过单个查询给出。
SELECT SUM(CASE WHEN t1 > 0 THEN t1 ELSE 0 END) AS t1Sum,
SUM(CASE WHEN t2 > 0 THEN t2 ELSE 0 END) AS t2Sum,
SUM(CASE WHEN t3 > 0 THEN t3 ELSE 0 END) AS t3Sum
FROM tab_1
您可以在 INFORMATION_SCHEMA.COLUMNS
和 PREPARE statement
SET @sql := '';
SELECT
GROUP_CONCAT('SELECT SUM(',COLUMN_NAME,') FROM tab_1 WHERE ',COLUMN_NAME, ' > 0' SEPARATOR ' UNION ALL ') INTO @sql
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA ='your_database_name'
AND TABLE_NAME ='your_table_name';
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE stmt;