以数值形式拆分/分解mysql字符串
我创建了一个(复杂)子查询,将结果放入变量中,如:以数值形式拆分/分解mysql字符串,mysql,Mysql,我创建了一个(复杂)子查询,将结果放入变量中,如: @mylist := (select .... ) 返回的值是逗号分隔的字符串。。因为在子查询中我也使用concat(),所以该值是一个字符串 在同一SQL中,我希望在另一个子查询中使用此变量,如: where table.mycolumn IN (@mylist) 问题在于,由于@mylist是一个字符串,Mysql将查询读取为: where table.mycolumn IN('575030,655156,655157') 而我希望
@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您可以使用该函数(在您指定的mysql版本中)。它使用逗号作为分隔符拆分提供的字符串(在您的情况下存储在变量中),并返回指定值第一次出现的索引的索引(0
,如果未找到)
无论@mylist中的分隔符是什么,这都有效吗?不,根据文档,没有参数可以更改分隔符。虽然可以添加
FIND_-IN_集(id,REPLACE(@mylist,'my_separator',','))
,但是如果要提取的值可以包含逗号,则无法工作。鉴于此限制,FIND_-IN_集中最好有。我不记得Oracle 11g是如何做到这一点的;使用WHERE FIND_IN_SET(id,@mylist)>0是否更好,因为如果没有找到匹配项,它将返回“0”?0
的计算结果为false(),因此由于函数无法返回负值,>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);
CREATE [TEMPORARY] TABLE IF NOT EXISTS tmp_users (
"id" INT,
PRIMARY KEY (id)
)
INSERT INTO tmp_users (...);