【问题标题】:Split/explode mysql string in numeric values在数值中拆分/分解mysql字符串
【发布时间】:2017-02-21 00:20:39
【问题描述】:

我创建了一个(复杂的)子查询,我将结果放在一个变量中,例如:

@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


    【解决方案1】:

    您可以使用函数FIND_IN_SET(您指定的mysql版本中的it is available)。它使用逗号作为分隔符拆分提供的字符串(在您的情况下存储在变量中)并返回第一次出现指定值的索引的索引(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);
    

    自动转换足以在大多数情况下自动管理原始类型和最终字符串之间的比较。


    更新

    虽然它回答了您的问题,但在查找大量 ID 时,建议的解决方案可能会变慢。更好的解决方案是放弃使用变量并将结果存储在临时表中

    CREATE [TEMPORARY] TABLE IF NOT EXISTS tmp_users (
      "id" INT,
      PRIMARY KEY (id)
    )
    
    INSERT INTO tmp_users (...);
    

    【讨论】:

    • 不管@mylist 中的分隔符是什么,这都能正常工作吗?
    • 不,根据文档,没有更改分隔符的参数。虽然可以添加FIND_IN_SET(id, REPLACE(@mylist, 'my_separator', ',')),但如果要提取的值可以包含逗号,它将不起作用。
    • 鉴于此限制,FIND_IN_SET 很好。我不记得在 Oracle 11g 中这是如何完成的。
    • 再问一个问题;使用 WHERE FIND_IN_SET(id, @mylist)>0 是否更好,因为如果找不到匹配项,它会返回 '0' ?
    • 0 的计算结果为 false (FALSE in fact is 0),因此由于函数无法返回负值,&gt;0 是多余的。
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多