MYSQL-查找行,其中部分搜索字符串与列中的部分值匹配

MYSQL-查找行,其中部分搜索字符串与列中的部分值匹配,mysql,Mysql,我在任何地方都找不到这个,这是我的问题: 我有一个类似“123445”的字符串,然后我有一个mysql表,它有一列,我们称之为数字,如下所示: numbers 1 2 6 8 9 14 3 1 5 3 6 9 7 8 9 23 44 10 我正在尝试找到最简单的方法(希望是在单个查询中)来查找行,其中搜索字符串中的任何数字(1、2、3、4或5)都包含在数字列中。在给出的示例中,我正在查找带有1、2和3的行(因为它们与我

我在任何地方都找不到这个,这是我的问题:

我有一个类似“123445”的字符串,然后我有一个mysql表,它有一列,我们称之为数字,如下所示:

numbers

1 2 6 8 9 14   
3              
1 5 3 6 9      
7 8 9 23 44    
10          
我正在尝试找到最简单的方法(希望是在单个查询中)来查找行,其中搜索字符串中的任何数字(1、2、3、4或5)都包含在数字列中。在给出的示例中,我正在查找带有1、2和3的行(因为它们与我的搜索字符串共享数字)

我试图用一个查询而不是循环来实现这一点

谢谢

SELECT * FROM MyTable WHERE (numbers LIKE '%1%' OR numbers LIKE '%2%')
或者你也可以使用REGEX,比如


最好的解决方案是去掉包含值列表的列,并使用一个模式,其中每个值都位于自己的行中。然后您可以使用(1、2、3、4、5)中的
WHERE number
并将其与包含其余数据的表连接起来

但是如果不能更改模式,可以使用

选择*
从你的桌子上
其中数字REGEXP'[]:
  • 这里是一个起点(拆分字符串函数):=拆分字符串(字符串、分隔符、位置)
  • 创建一个函数,以便将字符串转换为数组:=stringSplitted(字符串,分隔符)
  • 创建一个函数以比较两个数组:=arrayIntersect(array1,array2)


  • 两个带循环的函数定义和一个不带任何循环的查询将规范化您的模式,这样您就不会在单个列中包含值列表。我同意@Barmar的观点,您的模式看起来像一个反模式。当您可能有另一个带有整数可索引列的表时,保存字符串和执行字符串搜索没有任何优势对于数字。不幸的是,我面临着一种必须使用现有数据的情况。我知道这不是一个好的数据库设计,我同意最终使用标准形式是最好的解决方案。感谢您的建议!
    如“%2%”
    将匹配
    23
    。有时我会得到很多需要检查的数字nd做太多的ORs是非常耗时的。尽管如此。这是可行的,但当搜索字符串较大时,我会出现“正则表达式太大”错误。这看起来确实是一个很好的解决方案,但该数据库的设计似乎让它变得很难。但我仍然认为我必须重做数据库以永久性地解决该问题…如果结果是这样的话我唯一的永久解决方案是,此答案将被接受。谢谢!如果搜索字符串非常大,您可以将其分成更小的组,并将它们与
    WHERE numbers REGEXP'组合[[:是的,这是有效的!这里的长期解决方案仍然是一个正常的形式,但至少我现在可以继续这个项目。我已经接受了你的回答@Barmar。谢谢!只是一个澄清,我不得不删除[[:@Nireti如果这样做,搜索
    1
    将匹配
    12
    31
    415
    ,等等。您需要单词边界来匹配整个单词。
    SELECT * FROM events WHERE id REGEXP '5587$'
    
    SELECT *
    FROM yourTable
    WHERE numbers REGEXP '[[:<:]](1|2|3|4|5)[[:<:]]'
    
    SELECT numbers    
    FROM table    
    WHERE arrayIntersect(@argument, numbers)