【问题标题】:MySQL stored procedure passing array of number in parametersMySQL存储过程在参数中传递数字数组
【发布时间】:2015-07-08 15:47:46
【问题描述】:

我不确定我做错了什么......

我有一个简单的查询:

SELECT * FROM locations WHERE (ID IN (1, 2, 3, 4, 5));

现在我只是把那个查询做成了一个存储过程,参数类型为 LONGTEXT

sp_FetchMultipleLocations(IN argLocations LONGTEXT)
BEGIN
    SELECT * FROM locations WHERE (ID IN (argLocations));
END;

然后我在该参数中调用具有多个值的存储过程:

CALL sp_FetchMultipleLocations('1, 2, 3, 4, 5');

但是 where 子句中的 IN 语句似乎不起作用,它只显示第一个 (1) 位置...为什么会这样?

谢谢

【问题讨论】:

    标签: mysql stored-procedures parameters where-clause


    【解决方案1】:

    参数是一个单一的整体字符串。仅仅因为您在 sproc 内的 IN 子句中使用该参数并不意味着 MySQL 知道它应该将该 csv 字符串拆分为单独的值 - 它不知道 CSV 是什么,也不应该知道。

    您必须使用动态 sql,例如在伪代码中:

    procedure foo(in args longtext)
    begin
        sql = concat('SELECT ... WHERE foo IN (', args, ')')
        execute @sql
    end
    

    【讨论】:

      【解决方案2】:

      你只需要使用一个拆分功能,用逗号来做。

      你现在传递它的方式是一个字符串。

      【讨论】:

      • 不确定您的意思?存储过程以报表形式开始调用(水晶报表)。
      【解决方案3】:

      今天在 this page 上找到了这个

      SET @c = 'xxx,yyy,zzz';
      SELECT * from table 
      WHERE FIND_IN_SET(columnname,@c);
      

      为我工作。

      【讨论】:

        猜你喜欢
        • 2012-10-13
        • 2010-11-07
        • 1970-01-01
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        相关资源
        最近更新 更多