IN Clause对我来说不适用于MySQL

时间:2014-01-04 08:49:01

标签: mysql sql select in-clause find-in-set

我将参数传递为“Suburbun”,“Indigo”以检索与MySql中创建的以下存储过程中的两个广告系列匹配的记录。

CREATE PROCEDURE `DemoSP`(Campaign VARCHAR(3000))
BEGIN
    SET @query = CONCAT('Select * from vicidial_log WHERE campaign_id IN (?)');
  PREPARE stmt FROM @query;
  SET @CampaignID = Campaign;
  EXECUTE stmt USING @CampaignID;
  DEALLOCATE PREPARE stmt;
END;

它没有任何行!

但是当我在SP中仅通过“Suburbun”时,它会产生6行!

我哪里错了?

- 回答!

我尝试了Lee Fentress在http://www.poolofthought.com/index.php/2008/12/28/a-comma-seperated-list-as-parameter-to-mysql-stored-procedure/中的评论,并且peterm的答案反映了类似的编码,

有效!

谢谢,但与SQL Server相比,我发现这个负面标记。

哎呀,谢谢你们!

3 个答案:

答案 0 :(得分:0)

试试这个:

无需使用PREPARE STATEMENT。您可以使用FIND_IN_SET()函数

获取结果
SELECT * FROM vicidial_log WHERE FIND_IN_SET(campaign_id, Campaign)

答案 1 :(得分:0)

在这种情况下,您将无法使用USING。您可以构建完整的查询sting并在不使用参数的情况下执行它

DELIMITER $$
CREATE PROCEDURE DemoSP(Campaign VARCHAR(3000))
BEGIN
  SET @query = CONCAT('SELECT * FROM vicidial_log WHERE campaign_id IN (', Campaign, ')');
  PREPARE stmt FROM @query;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

注意:确保您在Campaign中传递的分隔值已正确引用(如您所说),并且值中的引号(如果有)将被转义。< / p>

这是 SQLFiddle 演示

答案 2 :(得分:-1)

试试这个

"Select * from vicidial_log WHERE campaign_id IN ('?')"

而不是

'Select * from vicidial_log WHERE campaign_id IN (?)'