表结构如下:
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里面,得到的结果是错误的。
请问应该怎么做才是对的?

解决方案 »

  1.   


    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)