如何使用正则表达式从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
相关产品推荐
相关产品推荐

