在存储过程 (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