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

How to extract digits from field using regex

我使用的是 Firebird 2.5,我有一个包含字母、数字和特殊字符的字段(称为标识符)。我想使用正则表达式仅提取新列中的数字。我试过类似下面的方法,但它不起作用。

知道如何在不使用存储过程或执行块的情况下使用正则表达式实现此目的吗

SELECT ORDER_ID,
        ORDER_DATE,
         SUBSTRING(IDENTIFIER FROM 1 TO 10) SIMILAR TO '^[0-9]{10}$' --- DESIRED EXTRACTION COLUMN
  FROM ORDERS

数据示例

IDENTIFIER          DESIRED OUTPUT
ANDRE 02869567995   02869567995
02869567995 MARIA   02869567995
028.695.67.995      02869567995
028695679-95        02869567995

在任何版本的 Firebird 中都不可能。

您不能在 Firebird 2.5 中执行此操作,至少在没有 UDF 或(可选择的)存储过程的帮助下不能这样做。我不知道第三方 UDF 提供正则表达式,因此您可能需要自己编写。

在 Firebird 3.0 中,您还可以使用 UDR 或存储函数来实现此目的。不幸的是,仅使用 Firebird 中提供的正则表达式功能不足以解决这个问题。


注意:剩下的答案是基于如果字符串的前10个字符是数字则提取数字的假设。随着问题的更新,这个假设不再有效。

就是说,如果您的需求完全如您的问题所示,即仅从字符串中提取前 10 个字符(如果它们都是数字),那么您可以使用:

case 
  when IDENTIFIER similar to '[[:DIGIT:]]{10}%'
    then substring(IDENTIFIER from 1 for 10)
end

(顺便说一句,位置 SUBSTRING syntaxfrom <start> for <length>,而不是 from <start> to <end>

在 Firebird 3.0 及更高版本中,您可以将 SUBSTRING(... SIMILAR ...) 与 SQL 正则表达式模式结合使用。假设你想从字符串的开头提取 10 位数字,你可以这样做:

substring(IDENTIFIER similar '#"[[:DIGIT:]]{10}#"%' escape '#')

#" 分隔要提取的模式(其中 #ESCAPE 子句中指定的自定义转义字符)。模式的其余部分必须匹配字符串的其余部分,因此在此处使用 %(在其他情况下,您可能需要在 第一个 [=] 之前指定模式 16=] 还有。

查看此 dbfiddle 示例。