使用 regexp_replace 从数字中删除字母

Using regexp_replace to remove letters from numbers

我有一堆关于高度的数据 - 有些只是数字,有些在末尾包括米或 '.我也有几个范围 1200-1300 等(我想第二个问题必须以不同的方式解决)。我尝试使用 regexp_replace 进行试验,但 [^a-z] 似乎不起作用。 你们中有人知道如何摆脱所有非数字的东西吗?另外,如果您能推荐 website/book/course 关于如何清除数据的好方法,我将不胜感激。谢谢!

让我们将范围(如 1200-1300)放在一边,因为 - 即使不考虑任何类型的编程 - 也不清楚你想从中得到什么 "extract"。而且,如果您的数据中可能出现 '5 ft 10 in' 或类似的问题,您也可能会遇到问题。 (如果所有高度都不使用相同的测量单位,则不清楚整个事情意味着什么 - 有些以米为单位,有些以英尺为单位,当你只保留数字时,信息就会消失)。

要从字符串中删除所有非数字并保留数字,您不需要正则表达式,它可能比标准字符串函数慢很多(慢一个数量级!)。

删除所有非数字字符的一种方法是使用 TRANSLATE 函数。像这样:

translate(input_string, '0123456789' || input_string, '0123456789')

函数 "translates"(将 0 替换为 0,将 1 替换为 1,等等)以及输入字符串中尚未出现在第二个参数中的任何字符 (在本例中表示 "non-digit")变为空(空、zip、消失、被删除)。

示例(注意使用 TO_NUMBER 也可以转换为实际数字):

with
  data (input_string) as (
    select '1500'   from dual union all
    select '2100 m' from dual union all
    select '535 ft' from dual
  )
select input_string,
       to_number(translate(input_string, '0123456789' || input_string, 
                                         '0123456789')) as extracted_number
from   data;

INPUT_STRING EXTRACTED_NUMBER
------------ ----------------
1500                     1500
2100 m                   2100
535 ft                    535