如何在指定字符串中查找目标数字并筛选符合匹配条件的数据行
多数据库实现方案
核心需求为判断两个逗号分隔数字的字符串字段,同时包含指定的所有目标值,不同数据库可通过自带的字符串处理函数直接实现:
MySQL 实现
使用MySQL原生FIND_IN_SET函数判断指定值是否存在于逗号分隔字符串中:
SELECT ID FROM 你的表名 WHERE FIND_IN_SET('100', STRING1) > 0 AND FIND_IN_SET('201', STRING1) > 0 AND FIND_IN_SET('1', STRING2) > 0 AND FIND_IN_SET('4', STRING2) > 0;
PostgreSQL 实现
先将字符串转为整数数组,再用数组包含运算符@>判断是否覆盖所有目标值:
SELECT ID FROM 你的表名 WHERE string_to_array(STRING1, ',')::int[] @> ARRAY[100,201] AND string_to_array(STRING2, ',')::int[] @> ARRAY[1,4];
SQL Server 实现(2016及以上版本)
通过STRING_SPLIT拆分字符串后分组统计匹配数量,匹配数等于目标值数量即符合条件:
SELECT t.ID FROM 你的表名 t CROSS APPLY STRING_SPLIT(t.STRING1, ',') s1 CROSS APPLY STRING_SPLIT(t.STRING2, ',') s2 WHERE s1.value IN ('100','201') AND s2.value IN ('1','4') GROUP BY t.ID HAVING COUNT(DISTINCT s1.value) = 2 AND COUNT(DISTINCT s2.value) = 2;
提示:用逗号分隔存储多值的设计不符合数据库第一范式,仅适合小数据量简单场景使用。如果这类查询需求较多、数据量较大,建议将多值字段拆分为独立关联表存储,查询性能和可维护性都会大幅提升。
内容的提问来源于stack exchange,提问作者maxime mkhe
相关产品推荐
相关产品推荐

