在存储过程 (MySQL) 上使用 WHERE IN

Posted

技术标签:

【中文标题】在存储过程 (MySQL) 上使用 WHERE IN【英文标题】:Working with WHERE IN on Stored Procedure (MySQL) 【发布时间】:2013-08-02 21:29:18 【问题描述】:

目标

通过单个 VARCHAR() 参数传递多个值。

场景

在我的应用程序中有一个从某个表中获取产品的过程。我需要的很简单:如果我通过了,则通过id 获取三个(或其他)结果。例如: CALL getProducts('1, 2, 3');.

为此,我正在使用IN 子句。看看我的查询:

BEGIN
    Select product.Name
    From app_products As product
    Where product.Id In (1, 2, 3)
END

我怎样才能通过参数传递那些1, 2, 3

我已经尝试过的

查看我的查询及其参数:

CREATE PROCEDURE `getProductsPrices`(IN `ids` VARCHAR(255))
BEGIN
    Select product.Name
    From app_products As product
    Where product.Id In (ids)
END

现在,当我调用它时:

CALL `getProductsPrices`('1, 2, 3')

返回是:

警告:截断不正确的 DOUBLE '1, 2, 3'

有人对我有什么建议吗?

重复?

我认为这个主题没有重复,因为我已经搜索过相同的主题但没有成功。

【问题讨论】:

看起来像 ***.com/questions/8149545/… 的副本 @Declan_K 问题似乎是一样的,但我不认为这是因为通过的解决方案没有解决我的问题。 那你应该再试一次,因为这些解决方案肯定能回答你的问题。您可能想要检查您的查询(手动构建)是否确实返回了您所期望的。 【参考方案1】:

可能对索引不太友好,但您也许可以使用find_in_set 函数...

where find_in_set(product.id, ids)

否则需要将分隔字符串解析为临时表并与该表连接。

【讨论】:

对我没用。我试过CALL getProductsPrices('1, 2, 3') 但返回只是参数的第一部分(在我们的例子中是1)。 可能需要将 product.id 类型转换为字符串。不过,罗兰多的答案可能会更好,并且应该正确处理索引。【参考方案2】:

需要设置动态SQL

DELIMITER $$
DROP PROCEDURE `getProductsPrices` $$
CREATE PROCEDURE `getProductsPrices`(IN `ids` VARCHAR(255))
BEGIN
    SET @sql = 'Select product.Name From app_products';
    SET @sql = CONCAT(@sql,' As product Where product.Id In (',`ids`,')');
    PREPARE s FROM @sql;
    EXECUTE s;
    DEALLOCATE PREPARE s;
END $$
DELIMITER ;

试试看!!!

【讨论】:

CONCAT()、@RolandomysqlDBA 上存在语法错误?我问这个是因为当我执行查询时,会为我显示一个syntax error at line 4 near '' 我认为mysql不喜欢换行符。请再试一次。 我不知道 MySQL 的“单行”问题。你解决了我的问题,谢谢!

以上是关于在存储过程 (MySQL) 上使用 WHERE IN的主要内容,如果未能解决你的问题,请参考以下文章

我想用动态子句制作 MySQL 存储过程 where [关闭]

MySQL 存储过程 SELECT、三个 WHERE CLAUSE 值和 ORDER BY

请教一个mysql 存储过程的问题?

在mysql select语句中使用条件where子句

mysql存储过程中,delete语句未根据where条件进行筛选,求救了。

mysql存储过程中怎么在循环中取变量值???