2013-12-08 68 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簡單讓我很煩惱 - 我總是看着複雜 - 這是完美的謝謝! –