我正在研究一个存储过程,它基本上是基于传递给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,尽管列表中存在所需的字符串。

最佳答案

encounter_type_list是一个字符串,但IN语句是用于集合的,因此如果集合中始终有一个字符串项,则结束于第二个。
您应该使用任何字符串搜索函数-例如INSTR()

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

或者使用以下"MACU","ABC"参数格式:
CALL someReport( '(1,2,3)','MACU,ABC');

FIND_IN_SET()在IF语句中检查它:
 IF(FIND_IN_SET('MACU',encounter_type_list)> 0) THEN

10-07 15:01