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

如何使用正则表达式从Firebird 2.5字段中提取纯数字

Firebird 2.5 提取字段中所有数字的实现方案

你原有写法的核心问题是 SIMILAR TO 是布尔匹配运算符,只会返回true/false的判断结果,不会返回提取的字符串,自然没法生成目标数字列。另外Firebird 2.5没有高版本内置的REGEXP_REPLACE正则替换函数,要实现全数字提取且不使用存储过程/EXECUTE BLOCK,可以用以下两种方案:

方案1:字符批量替换(适合非数字字符类型可控的场景)

如果你的业务场景中出现的非数字字符种类是固定的(比如你示例里的空格、点、横杠、大小写字母),可以直接用TRANSLATE或者嵌套REPLACE把所有非数字字符替换为空即可:

SELECT 
  ORDER_ID,
  ORDER_DATE,
  -- 第二个参数写所有你业务中会出现的非数字字符,都会被直接删除
  TRANSLATE(IDENTIFIER, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz .-', '') AS EXTRACTED_NUM
FROM ORDERS

如果非数字字符很少,也可以用嵌套REPLACE实现,示例的场景下三层替换就足够覆盖:

SELECT 
  ORDER_ID,
  ORDER_DATE,
  REPLACE(REPLACE(REPLACE(IDENTIFIER, ' ', ''), '.', ''), '-', '') AS EXTRACTED_NUM
FROM ORDERS

方案2:递归CTE(通用全场景)

如果非数字字符种类很多没法穷举,可以用递归CTE逐字符判断提取,不需要提前知道非数字的类型:

WITH RECURSIVE extract_digits (ORDER_ID, ORDER_DATE, str, pos, result) AS (
  -- 递归初始化:定位到第一个字符,结果初始为空
  SELECT ORDER_ID, ORDER_DATE, IDENTIFIER, 1, '' 
  FROM ORDERS
  UNION ALL
  -- 递归逻辑:逐字符判断,是数字就拼到结果里,否则跳过
  SELECT 
    ORDER_ID, 
    ORDER_DATE, 
    str, 
    pos + 1,
    result || CASE WHEN SUBSTRING(str FROM pos FOR 1) SIMILAR TO '[0-9]' THEN SUBSTRING(str FROM pos FOR 1) ELSE '' END
  FROM extract_digits
  WHERE pos <= CHAR_LENGTH(str)
)
-- 取递归结束后的最终结果
SELECT ORDER_ID, ORDER_DATE, result AS EXTRACTED_NUM
FROM extract_digits
WHERE pos = CHAR_LENGTH(str) + 1

内容的提问来源于stack exchange,提问作者Jonathan Livingston Seagull

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:09:03