【问题标题】:MYSQL - Stored Procedure Utilising Comma Separated String As Variable InputMYSQL - 使用逗号分隔字符串作为变量输入的存储过程
【发布时间】:2012-09-17 16:00:30
【问题描述】:

我希望有人能够提供帮助。我已经创建了我的第一个存储过程(没什么花哨的)但是我遇到了一个问题。

我想给它一个字符串输入,例如 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')

我必须如何格式化执行查询中的输入以使其将逗号分隔的字符串作为输入?

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    你可以使用:

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

    假设它实际上是逗号分隔的,这应该可以工作。在这种情况下,任何其他分隔都不起作用。

    【讨论】:

    • 这在存储过程中完美运行,谢谢。这也是我从 Cast Iron 应用程序中调用它的方式,这是一个额外的好处。
    • 这行得通,但它不是很有效,因为它需要从表中获取所有行,然后将每一行与您的集合进行比较,这反过来也必须遍历逗号分隔的列表以检查是否它匹配...如果您的列数较低,那么没关系,否则您应该找到一种击球方式
    • @Populus 评论需要被连根拔起 - FIND_IN_SET 不使用任何表索引,因此如果以这种方式使用可能会出现巨大的性能问题
    【解决方案2】:

    假设您传递的字符串以某种方式经过验证并且不包含恶意 sql,您可以使用准备好的语句:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      相关资源
      最近更新 更多