提问人:betta7391 提问时间:6/6/2022 最后编辑:lemonbetta7391 更新时间:6/7/2022 访问量:251
MySQL:数组包含另一个数组
MySQL: arrays contains another array
问:
我创建了两个具有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
函数,但未涵盖第三种情况。
答:
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
它有效!!非常感谢!:)但是你能解释一下为什么我的不起作用吗?如果你知道
评论
GROUP_CONCAT()
FIND_IN_SET()
FIND_IN_SET()