我创建了一个(复杂的)子查询,我将结果放入一个变量中,如下所示:
@mylist := (select .... ) 返回的值是一个逗号删除的字符串。因为在子查询中,我还使用了concat(),所以值是一个字符串。
在相同的SQL中,我希望在另一个子查询中使用这个变量,如下所示:
where table.mycolumn IN (@mylist)问题在于,因为@mylist是一个字符串,Mysql将查询读入如下:
where table.mycolumn IN('575030,655156,655157')而我希望它被执行为
where table.mycolumn IN(575030,655156,655157)如何将字符串转换为(数字)数组?
PS:我正在使用mysql 5.1
发布于 2016-10-12 09:34:12
您可以使用函数FIND_IN_SET (在指定的mysql版本中使用它是可用的)。它使用逗号作为分隔符拆分提供的字符串(在您的情况下存储在变量中),并返回指定值第一次出现的索引的索引(如果没有找到,则返回0)。
/* building the list */
> SELECT @mylist :=GROUP_CONCAT(id SEPARATOR ',') FROM users WHERE id < 10;
+-----------------------------------------+
| @mylist:=group_concat(id separator ',') |
+-----------------------------------------+
| 0,2,3,4,5,6,7,8,9 |
+-----------------------------------------+
> SELECT id, mail FROM users WHERE FIND_IN_SET(id, @mylist);自动浇铸足以自动管理原始类型和最终字符串之间的比较,大多数情况下都是这样。
更新
尽管它回答了您的问题,但在寻找大量ids时,建议的解决方案可能会变得缓慢。更好的解决方案是放弃使用变量并将结果存储在临时表中。
CREATE [TEMPORARY] TABLE IF NOT EXISTS tmp_users (
"id" INT,
PRIMARY KEY (id)
)
INSERT INTO tmp_users (...);https://stackoverflow.com/questions/39994516
复制相似问题