MySQL 存储过程在参数中传递数字数组
MySQL stored procedure passing array of number in parameters
我不确定我做错了什么...
我有一个简单的查询:
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) 位置...这是为什么?
谢谢
你只需要使用一个分割函数,用逗号分隔即可。
您现在传递它的方式是单个字符串。
参数是一个整体字符串。仅仅因为您在 sproc 内的 IN
子句中使用该参数并不意味着 MySQL 知道它应该将该 csv 字符串拆分为单独的值 - 它不知道 CSV 是什么,也不应该它。
您必须使用动态 sql,例如在伪代码中:
procedure foo(in args longtext)
begin
sql = concat('SELECT ... WHERE foo IN (', args, ')')
execute @sql
end
今天在 this page
上找到了这个
SET @c = 'xxx,yyy,zzz';
SELECT * from table
WHERE FIND_IN_SET(columnname,@c);
适合我。
我不确定我做错了什么...
我有一个简单的查询:
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) 位置...这是为什么?
谢谢
你只需要使用一个分割函数,用逗号分隔即可。
您现在传递它的方式是单个字符串。
参数是一个整体字符串。仅仅因为您在 sproc 内的 IN
子句中使用该参数并不意味着 MySQL 知道它应该将该 csv 字符串拆分为单独的值 - 它不知道 CSV 是什么,也不应该它。
您必须使用动态 sql,例如在伪代码中:
procedure foo(in args longtext)
begin
sql = concat('SELECT ... WHERE foo IN (', args, ')')
execute @sql
end
今天在 this page
上找到了这个SET @c = 'xxx,yyy,zzz';
SELECT * from table
WHERE FIND_IN_SET(columnname,@c);
适合我。