mysql 查询字符串在字符串中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 查询字符串在字符串中相关的知识,希望对你有一定的参考价值。
mysql中查询一个字符串是否包含在一个字段字符串中,比如我的数据表中有个字段中是一个字符串,比如是1,2,3,4,5,6,7,8
如果我的SQL查询条件是一个字符:'6' 来查询,我用的是:FIND_IN_SET(str,strlist) 函数
但如果我要查1,3是否在这个字符串中,该如何操作啊?且要查询的字符串的位置不固定,即有可能是1,2也有可能是3,6
from test
where id like '%1%2%'
select *
from test
where id like '%3%6%'追问
我试过这个方法了,但是,如果要查询的顺序是按照字符串里的顺序,那么,这样是能查到的,但如果顺序是随机的,就无法查询了。例如:要查6,4,7,就是空
追答如果你想乱序查,只能
select *
from test
where id like '%6%' and id like '%3%'
类似这样
我在查询前把顺序都调整好了,这个问题解决了,可是随之而来的是,当字段内容为1,2,3,而需要查询的字段为1,2,3.4的时候,就无法查询了,有什么解决的方法吗?
追答是3,4是3.4?
如果是3,4,就相关于满足 就取出的意思了
where id like '%3%' or id like '%4%'
如果是3.4,你取整u可以了
在数值中拆分/分解mysql字符串
【中文标题】在数值中拆分/分解mysql字符串【英文标题】:Split/explode mysql string in numeric values 【发布时间】: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
【问题讨论】:
【参考方案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
),因此由于函数无法返回负值,>0
是多余的。以上是关于mysql 查询字符串在字符串中的主要内容,如果未能解决你的问题,请参考以下文章