我正在研究一个基本上根据传递给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。
答案 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