如何用SQL筛选数字列dr_id中含数字2的行?有无替代转字符串的方法?
筛选数字字段中包含指定数字的行
除了你提到的转字符串搜索,确实还有纯数学运算的实现方式,两种方法各有适用场景,具体如下:
方法一:字符串转换搜索(最常用)
这是实际开发里最普遍的方案,语法简单,对绝大多数数据库都友好,数据量不大时性能完全够用(注意:数字转字符串后原数字索引会失效,若数据量极大需额外考虑)。
不同数据库的写法示例:
- MySQL/MariaDB:
SELECT first_name, dr_id FROM your_table WHERE CAST(dr_id AS CHAR) LIKE '%2%'; - PostgreSQL:
SELECT first_name, dr_id FROM your_table WHERE dr_id::text LIKE '%2%'; - SQL Server:
SELECT first_name, dr_id FROM your_table WHERE CAST(dr_id AS VARCHAR(20)) LIKE '%2%';
方法二:纯数学运算判断(无需转字符串)
如果不想做类型转换,可以通过取模和除法操作逐位检查数字是否包含2。这个方法适合对性能要求极高、且数字位数相对固定的场景,缺点是写法繁琐,位数不固定时实现复杂度会上升。
固定位数示例(以MySQL为例,处理最多6位数字):
SELECT first_name, dr_id FROM your_table WHERE dr_id % 10 = 2 -- 个位是2 OR FLOOR(dr_id / 10) % 10 = 2 -- 十位是2 OR FLOOR(dr_id / 100) % 10 = 2 -- 百位是2 OR FLOOR(dr_id / 1000) % 10 = 2 -- 千位是2 OR FLOOR(dr_id / 10000) % 10 = 2 -- 万位是2 OR FLOOR(dr_id / 100000) % 10 = 2; -- 十万位是2
可变位数示例(以PostgreSQL递归CTE处理任意位数):
WITH RECURSIVE digit_check AS ( SELECT first_name, dr_id, dr_id AS remaining, 1 AS position FROM your_table UNION ALL SELECT first_name, dr_id, FLOOR(remaining / 10), position + 1 FROM digit_check WHERE remaining > 0 ) SELECT DISTINCT first_name, dr_id FROM digit_check WHERE remaining % 10 = 2;
两种方法对比
- 字符串转换法:代码简洁易维护,适合绝大多数常规场景。
- 数学运算法:避免类型转换,极端性能要求下可能有优势,但代码复杂度高,位数多变时维护成本高。
内容的提问来源于stack exchange,提问作者Fernando Araiza
相关产品推荐
相关产品推荐

