2012-09-17 43 views
5

我希望有人能夠提供幫助。我創建了我的第一個存儲過程(沒有什麼奇特的),但是我遇到了一個問題。MYSQL - 使用逗號分隔字符串作爲變量輸入的存儲過程

我想給它一個字符串輸入,如1,2,3,4,5那麼它就是一個簡單的SELECT * FROM [TABLE] WHERE EAN IN (VAR);

所以存儲過程是這樣的:

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE PROCEDURE `moments`.`new_procedure`(IN var1 VARCHAR(255)) 
BEGIN 

SELECT * FROM moments.PRODUCT WHERE EAN IN (var1); 

END 

上午進出口試圖像這樣執行它:

作品

call moments.new_procedure('5045318357397') 

不起作用

call moments.new_procedure('5045318357397,5045318357427'); 

此執行,但犯規沒有帶回任何結果。難道分級第二條語句作爲一個字符串,因此它這樣做:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397,5045318357427') 

,而不是這樣的:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397','5045318357427') 

我希望如何格式化在執行查詢輸入得到它採取逗號分隔字符串作爲輸入?

回答

12

你可以使用:

SELECT * FROM moments.PRODUCT 
WHERE FIND_IN_SET(EAN, var1) 

這應該假設它是實際上是用逗號分隔的。在這種情況下,任何其他分隔都不起作用。

+0

這完美的存儲過程內,謝謝你。這也是我將從Cast Iron應用程序調用它的原因,這是額外的好處。 – MMKD

+2

這是有效的,但它不是非常有效,因爲它需要從表中獲取所有行,然後將每一行與您的集合進行比較,而這些行又必須遍歷逗號分隔的列表以檢查它是否匹配...如果您的列的數量很低,那麼它很好,否則你應該找到一個連擊方式 – Populus

+0

@Populus評論需要更多的連根拔 - FIND_IN_SET不使用任何表索引,所以如果以這種方式使用可能是一個巨大的性能問題 –

1

假設你通過某種方式驗證,並且不包含惡意的SQL字符串,您可以使用準備好的語句:

PREPARE stmt1 FROM CONCAT('select * from moments.PRODUCT WHERE EAN IN (',var1,')'); 
EXECUTE stmt1; 
相關問題