【问题标题】:how to use IN() function inside of stored procedure?如何在存储过程中使用 IN() 函数?
【发布时间】:2014-11-11 08:33:39
【问题描述】:

我在存储过程中使用了 mysql。在存储过程中,我使用 IN() 函数编写了选择查询。我在函数内部传递了 5 个值,但它只显示第一个值数据。我的代码是

DELIMITER $$ CREATE DEFINER=root@localhost PROCEDURE pro1(IN reg_id VARCHAR(50))

开始

SELECT COUNT(master_country_id) AS num FROM master_country WHERE master_region_id IN(reg_id) ORDER BY master_country_id DESC;

结束$$

分隔符;

国家是,

1 - 印度

2 - 澳大利亚

3 - 加拿大

4 - 西班牙

5 - 斯里兰卡

我调用的程序是

调用 pro1(1,4,2);

实际结果是,

印度、西班牙、澳大利亚

但它显示的结果是,

印度

【问题讨论】:

  • 有多少个参数?一,你的结果有多少?一。仅仅因为 varchar(50) 字符串看起来像 3 个值,它只是一个包含逗号的值。
  • 看看这个答案对你是否有意义stackoverflow.com/questions/25839148/…

标签: mysql stored-procedures


【解决方案1】:

你不能完全按照你想要的方式使用in。根据您的代码的措辞方式,存储过程仅在主区域与完整字符串匹配时才找到匹配项。所以,如果你传入1,2,3,那么匹配就在1,2,3——而不是在每个元素上。

你可以使用find_in_set()得到你想要的:

BEGIN

SELECT COUNT(master_country_id) AS num
FROM master_country
WHERE find_in_set(reg_id, master_region_id) > 0
ORDER BY master_country_id DESC;

END$$

这可行,但它不能使用索引。

您也可以使用动态 SQL (prepare/exec),但这会产生编译查询的开销。

【讨论】:

    【解决方案2】:
    DELIMITER $$ CREATE DEFINER=root@localhost PROCEDURE pro1(reg_id VARCHAR(50))
    
    BEGIN
    
    SELECT COUNT(master_country_id) AS num FROM master_country WHERE master_region_id REGEXP (reg_id) ORDER BY master_country_id DESC;
    
    END$$
    
    DELIMITER ;
    

    您可以将您的过程称为CALL pro1('1|4|2');

    【讨论】:

    • 它正在工作,但区域 id 大于 10 会显示所有区域。例如 10 - aaa, 12 - bbb, 13 - ccc, 14 - ddd 表示当我调用过程 CALL pro1('1|4|2'); 时显示所有区域;我怎样才能只获得特定地区..
    • CALL pro1('^1$|^4$|^2$');如果您想要相同的变量,请在前面使用 ^,最后使用 $
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2013-08-02
    • 2011-04-29
    • 2021-08-22
    • 2012-04-18
    相关资源
    最近更新 更多