我正在研究一个存储过程,它基本上是基于传递给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