MySQL:数组包含另一个数组

MySQL: arrays contains another array

提问人:betta7391 提问时间:6/6/2022 最后编辑:lemonbetta7391 更新时间:6/7/2022 访问量:251

问:

我创建了两个具有GROUP_CONCAT函数的数组。现在,我需要检查第一个是否包含在第二个中。

以下是一些示例:

Arr1: '1,2'
Arr2: '1,2,3'

RESULT: YES

Arr1: '2,3'
Arr2: '1,2,3'

RESULT: YES

Arr1: '1,3'
Arr2: '1,2,3'

RESULT: YES

我尝试使用LOCATE 函数,但未涵盖第三种情况。

MySQL SQL 数组 正则表达式

评论

3赞 Barmar 6/6/2022
你为什么用?使用原始归一化数据要容易得多。MySQL没有简单的方法来使用逗号分隔的值来做到这一点。GROUP_CONCAT()
1赞 Barmar 6/6/2022
在逗号分隔的字符串中搜索值的基本函数是 。但是您需要为每个要搜索的值单独调用它,没有任何东西会遍历所有项目。FIND_IN_SET()
0赞 betta7391 6/6/2022
@Barmar我需要对 t1 行进行分组,并且我需要维护每行的字段信息。就像球队一样:您按球队名称分组,并希望保留每个国家/地区的所有球员名称。之后,您将国家队的球员分组,并尝试搜索一个国家队的球员是否也是国家队的球员。我也试过了,但是,你怎么说对我的情况没有帮助FIND_IN_SET()
1赞 betta7391 6/6/2022
@Barmar也许正则表达式可以帮助我?你知道的?

答:

0赞 lemon 6/7/2022 #1

您可以尝试使用以下正则表达式语法:

SELECT @arr2 REGEXP CONCAT('(^|,)', REPLACE(@list1, ',', ',([0-9]+,)*'), '(,|$)'),
       @arr2 REGEXP CONCAT('(^|,)', REPLACE(@list2, ',', ',([0-9]+,)*'), '(,|$)'),
       @arr2 REGEXP CONCAT('(^|,)', REPLACE(@list3, ',', ',([0-9]+,)*'), '(,|$)'),
       @arr2 REGEXP CONCAT('(^|,)', REPLACE(@list4, ',', ',([0-9]+,)*'), '(,|$)'),
       @arr2 REGEXP CONCAT('(^|,)', REPLACE(@list5, ',', ',([0-9]+,)*'), '(,|$)'),
       @arr2 REGEXP CONCAT('(^|,)', REPLACE(@list6, ',', ',([0-9]+,)*'), '(,|$)'),
       @arr2 REGEXP CONCAT('(^|,)', REPLACE(@list7, ',', ',([0-9]+,)*'), '(,|$)')

基本上,将逗号替换为至少匹配逗号的正则表达式,以及后跟逗号的任意数字组合,然后将其括在以下两者之间:

  • 字符串或逗号的开头(^|,)
  • 字符串或逗号的末尾(,|$)

这样,arr2 应该包含列表的所有编号,以及任何其他编号。

当在 arr2 中找不到列表的元素时,输出为 0,当它们存在时,输出为 1。如果要获得“YES”和“NO”,则在语句中包含REGEXP操作的结果就足够了:IF

IF(@arr2 REGEXP CONCAT(...) = 1, 'YES', 'NO')

因此,将变量名称替换为表中的相应列。

在此处查看演示。

评论

0赞 betta7391 6/7/2022
这是一个很好的解决方案,但是有一个缺点:对于您的正则表达式,如果@arr2是并且@list是,则存在匹配项,并且对于我需要的内容不正确。我只需要匹配整数。我不熟悉正则表达式,所以如果你能帮我,那就太好了!:)'[,0-9]+''1,14,2,3'1,4
0赞 lemon 6/7/2022
你绝对是对的,我刚刚用它的改进版本更新了我的答案。@betta7391
0赞 betta7391 6/7/2022
更好,但仍然有缺点:火柴.我正在尝试使用这个,它似乎在我们使用的小示例中工作正常,但在我真正的查询中没有。我现在不知道为什么@arr2 = '1,1444,2,3'@list4 = '1,144'^(?=.*\b144\b)(?=.*\b1\b).*$
1赞 lemon 6/7/2022
db-fiddle.com/f/9UJAAGygLzZgCpkgSvVUbg/5 你能告诉我这是否适用于您的查询吗?@betta7391
1赞 betta7391 6/7/2022
它有效!!非常感谢!:)但是你能解释一下为什么我的不起作用吗?如果你知道