表结构如下:
DROP TABLE IF EXISTS `testtb`;
CREATE TABLE `testtb` (
`id` int(11) NOT NULL auto_increment,
`amount` decimal(10,0) default NULL,
`tag` varchar(50) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of testtb
-- ----------------------------
INSERT INTO `testtb` VALUES ('1', '11', 'a b');
INSERT INTO `testtb` VALUES ('2', '22', 'c d');
INSERT INTO `testtb` VALUES ('3', '32', 'a d');
INSERT INTO `testtb` VALUES ('4', '43', 'a b');我想建类似于下面的一个存储过程
DELIMITER $$DROP PROCEDURE IF EXISTS `testDT`$$CREATE PROCEDURE `testDT`(IN num VARCHAR(100)) -- num 的格式类似于 a b@c d@a d
BEGIN
SELECT SUM(amount) AS ttt FROM testtb
WHERE tag IN('a b','c d')
GROUP BY tag;
END$$DELIMITER ;其中 WHERE tag IN ('a b','c d')这个IN 参数是从num计算出来的。
我使用REPLACE(num,'@','\',\''),'\'')放到IN里面,得到的结果是错误的。
请问应该怎么做才是对的?
DROP TABLE IF EXISTS `testtb`;
CREATE TABLE `testtb` (
`id` int(11) NOT NULL auto_increment,
`amount` decimal(10,0) default NULL,
`tag` varchar(50) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of testtb
-- ----------------------------
INSERT INTO `testtb` VALUES ('1', '11', 'a b');
INSERT INTO `testtb` VALUES ('2', '22', 'c d');
INSERT INTO `testtb` VALUES ('3', '32', 'a d');
INSERT INTO `testtb` VALUES ('4', '43', 'a b');我想建类似于下面的一个存储过程
DELIMITER $$DROP PROCEDURE IF EXISTS `testDT`$$CREATE PROCEDURE `testDT`(IN num VARCHAR(100)) -- num 的格式类似于 a b@c d@a d
BEGIN
SELECT SUM(amount) AS ttt FROM testtb
WHERE tag IN('a b','c d')
GROUP BY tag;
END$$DELIMITER ;其中 WHERE tag IN ('a b','c d')这个IN 参数是从num计算出来的。
我使用REPLACE(num,'@','\',\''),'\'')放到IN里面,得到的结果是错误的。
请问应该怎么做才是对的?
mysql> DELIMITER /
mysql>
mysql> DROP PROCEDURE IF EXISTS `testDT`/
Query OK, 0 rows affected (0.00 sec)mysql>
mysql> CREATE PROCEDURE `testDT`(IN num VARCHAR(100)) -- num 的格式类似于 a b@c
d@a d
-> BEGIN
-> declare str varchar(200);
-> set @sql = concat('SELECT SUM(amount) AS ttt FROM testtb WHERE tag IN(','
\'',replace(num,'@','\',\''),'\') GROUP BY tag');
-> prepare str from @sql;
-> execute str;
-> deallocate prepare str;
-> END/
Query OK, 0 rows affected (0.00 sec)mysql>
mysql> DELIMITER ;
mysql>
mysql> call testDT('a b@c d@a d');
+------+
| ttt |
+------+
| 54 |
| 32 |
| 22 |
+------+
3 rows in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)