MySQL IN运算符不在存储过程设置中工作

时间:2014-05-07 12:48:37

标签: mysql stored-procedures

我正在研究一个基本上根据传递给proc的参数构造SQL的存储过程。其中一个参数是TEXT类型(从应用程序端传递为ArrayList),并且此特定参数中的值会影响构造SQL的大量工作。

我正在尝试根据字符串“MACU”是否在列表中来实现分支条件。简而言之,proc类似于:

DROP PROCEDURE IF EXISTS `someReport`$$

CREATE PROCEDURE `someReport`(IN group_id_list TEXT, IN encounter_type_list TEXT)

BEGIN

SET @QUERY = CONCAT(@QUERY, 'SELECT * FROM beneficiary b');

IF encounter_type_list IS NOT NULL THEN
     IF("MACU" IN (encounter_type_list) > 0) THEN
           SET @QUERY = CONCAT(@QUERY, ' JOIN table1 t1 ON t1.id = b.id ');
     END IF;

     IF ("MACU" IN (encounter_type_list) <= 0) THEN
           SET @QUERY = CONCAT(@QUERY, ' JOIN table2 t2 ON t2.id = b.id ');
     END IF;
END IF;


SET @QUERY = CONCAT(@QUERY,' WHERE b.group_id IN ',group_id_list);

-- PREPARE stmt3 FROM @QUERY;
-- EXECUTE stmt3;
-- DEALLOCATE PREPARE stmt3; 


SELECT "MACU", encounter_type_list , "MACU" IN (encounter_type_list);


END$$
DELIMITER ;

目前,虽然encounter_type_list包含“MACU”,但我总是在第二个IF语句中结束。例如CALL someReport( '(1,2,3)','("MACU","ABC")');打印以下输出:

|  MACU  |  encounter_type_list  |   "MACU" IN (encounter_type_list)  |
   MACU       ("MACU","ABC")                        0

我无法理解为什么尽管列表中存在所需的字符串,但"MACU" IN (encounter_type_list)部分返回0。

1 个答案:

答案 0 :(得分:1)

encounter_type_list是一个字符串,但IN语句用于集合,因此您最终会在第二个IF上,因为您在集合"MACU","ABC"中始终有一个字符串项。

您应该使用任何字符串搜索功能 - 例如INSTR()

   IF(INSTR(encounter_type_list,'"MACU"') > 0) THEN

或使用以下encounter_type_list参数格式:

CALL someReport( '(1,2,3)','MACU,ABC');

FIND_IN_SET()在IF语句中检查它:

 IF(FIND_IN_SET('MACU',encounter_type_list)> 0) THEN