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