MySQL 8.0.31中如何在单元格数组内精准搜索指定订单号?
精准匹配分隔符分隔的订单号字段
方案1:用FIND_IN_SET()(推荐)
如果能把字段的分隔符改成逗号,直接用MySQL内置的FIND_IN_SET()就行,这个函数专门处理逗号分隔的字符串,完全不会出现LIKE那种误匹配的情况:
SELECT * FROM your_table WHERE FIND_IN_SET('1632', your_order_field) > 0;
原理很简单:找到目标值就返回它在字符串里的位置(大于0),找不到就返回0,刚好满足精准匹配的需求。
方案2:正则表达式匹配(支持任意分隔符)
要是不想改分隔符,比如现在用的是;、|这类符号,用正则就能精准锁定独立的订单号:
假设当前分隔符是;,SQL这么写:
SELECT * FROM your_table WHERE your_order_field REGEXP '(^|;)1632(;|$)';
拆解下正则逻辑:
(^|;):匹配字符串开头或者分隔符,保证目标订单号前面没有多余数字1632:你要找的目标订单号(;|$):匹配分隔符或者字符串结尾,保证目标订单号后面没有多余数字
换分隔符的话,把语句里的;换成你实际用的符号就行。
方案3:替换分隔符后用FIND_IN_SET()
如果暂时不想改存储的分隔符,但又想用FIND_IN_SET()的简洁性,可以临时把字段里的分隔符换成逗号:
比如当前分隔符是|,SQL语句如下:
SELECT * FROM your_table WHERE FIND_IN_SET('1632', REPLACE(your_order_field, '|', ',')) > 0;
相当于临时转换格式,效果和方案1一致。
额外提醒
虽然上面的方法都能解决问题,但从数据库设计的角度来说,别用单个字段存多个值,最好拆成关联表,用一对多的关系存订单号,这样查询效率更高,也符合数据库规范化的要求。
内容的提问来源于stack exchange,提问作者mitebu
相关产品推荐
相关产品推荐

