使用regexp_replace从数字中删除字母

时间:2018-06-19 22:27:42

标签: sql oracle regexp-replace

我有一堆海拔高度的数据-有些只是数字,有些包括结尾处的米或'。我也有一些1200-1300等范围(我想第二个问题必须用不同的方式解决)。我尝试使用regexp_replace进行实验,但是[^ a-z]似乎无法正常工作。 你们每个人都有一个很好的主意,如何摆脱数字以外的所有东西?此外,如果您可以推荐有关如何清除数据的良好网站/书籍/课程,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:3)

让我们将范围(如1200-1300)留在一边,因为-即使不考虑任何编程方式,也不清楚您想要从中“提取”什么。并且,如果您的数据中可能存在诸如'5 ft 10 in'之类的问题,您也可能会遇到问题。 (目前尚不清楚如果所有海拔高度都不使用相同的度量单位,整个含义是什么-有些以米为单位,有些以英尺为单位,仅保留数字便会消失信息。)

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

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

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

该函数将0转换为0,将0替换为1,以此类推,然后将输入字符串中尚未出现在第二个自变量中的任何字符“翻译”(替换)(这种情况意味着“非数字”)为零(null,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