【问题标题】:Using regexp_replace to remove letters from numbers使用 regexp_replace 从数字中删除字母
【发布时间】:2018-06-20 06:41:21
【问题描述】:

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

【问题讨论】:

    标签: sql oracle regexp-replace


    【解决方案1】:

    让我们把范围(比如 1200-1300)放在一边,因为 - 即使不管任何类型的编程 - 也不清楚你想从中“提取”什么。而且,如果您的数据中可能存在 '5 ft 10 in' 或类似的问题,您也可能会遇到问题。 (如果所有海拔高度都没有使用相同的测量单位,那么整个事情的含义就不清楚了——有些以米为单位,有些以英尺为单位,当你只保留数字时,信息就会消失)。

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

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

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

    函数“翻译”(替换)0 为 0,1 为 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
    

    【讨论】:

    • 我还能在整个列上运行它吗?还是我必须输入每个字符串?
    • 您可以在整个列上运行它。 WITH 子句只是模拟测试数据,它不是查询的一部分。将data 替换为您的表名,将input_string 替换为您的列名。但请注意,事先请注意,如果输入为 1200-1300 等,查询将返回 12001300 - 它不会区分输入中非数字的不同原因。
    • 非常感谢您的帮助。在清理数据时,我感到很无助。
    • @Coolkidscandie - 这是一次性工作吗?您(您的团队、组织等)是否首先解决了数据以非数字形式存储的原因?如果你不先解决这个问题,清理数据将是一项持续的工作——这是非常低效的。那么——如果是一次性工作,那么性能不应该是主要问题;正确性应该是。然后你需要获取所有已经不是数字的值,看看你必须处理什么样的情况。然后,您可以编写一个简单的函数来一次性处理所有情况。我们可以在这里提供帮助,您只需提出要求。
    • 这是一个一次性的工作,因为我自己正在学习 SQL,所以我可以专业地处理数据;)所以这只是我在网上找到的一堆数据,我现在正在尝试制作使用它。不过谢谢
    猜你喜欢
    • 2019-04-01
    • 2020-02-08
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多