2013-12-08 41 views
0

我想创建一个存储过程,将逗号分隔列表作为值,并将其推入具有IN子句的选择语句。我知道find_in_set可以工作,但确实会有性能开销。我还试用了一份准备声明,但问题依然存在。MySql存储过程和逗号分隔Varchar与声明

我的实施例:

我的参数是SP1和包含值: 'valuex,VALUE年,valuez'。

BEGIN 

    set @sql = concat('select * from tablename WHERE assignedTo in (', sp1, ')'); 

    PREPARE q FROM @sql; 

    execute q; 

END 

正如预期的那样,由于SQL会将值视为列名,因此会引发错误。我的问题是我如何实现:'valuex','valuey','valuez'FROM'valuex,valuey,valuez'?

回答

1

可以使用replace功能:

BEGIN 

    set @sql = concat("select * from tablename WHERE assignedTo in ('", replace(sp1,",","','"), "')"); 

    PREPARE q FROM @sql; 

    execute q; 

END 
+1

同样如上有效 - 谢谢。 –

1

的选项是:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `sp_test`$$ 

CREATE PROCEDURE `sp_test`(`sp1` VARCHAR(50)) 
BEGIN 
    SET `sp1` := REPLACE(REPLACE(`sp1`, ', ', ','), ',', '\',\''); 
    SET @`query` := CONCAT('SELECT `column0`, `column1` FROM `tablename` WHERE `assignedTo` IN (\'', `sp1`, '\');'); 
    PREPARE `stmt` FROM @`query`; 
    EXECUTE `stmt`; 
    DEALLOCATE PREPARE `stmt`; 
END$$ 

DELIMITER ; 

CALL `sp_test`('valuex, valuey, valuez'); 
-- SELECT `column0`, `column1` FROM `tablename` WHERE `assignedTo` IN ('valuex','valuey','valuez'); 
+0

ahhh简单让我很烦恼 - 我总是看着复杂 - 这是完美的谢谢! –