You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:47:16