【问题标题】:Oracle SQL regex extractionOracle SQL 正则表达式提取
【发布时间】:2016-12-26 18:24:02
【问题描述】:

我在一列中有如下数据

+----------------------+
|      my_column       |
+----------------------+
| test_PC_xyz_blah     |
| test_PC_pqrs_bloh    |
| test_Mobile_pqrs_bleh|
+----------------------+

如何将以下内容提取为列?

+----------+-------+
| Platform | Value |
+----------+-------+
|   PC     |  xyz  |
|   PC     |  pqrs |
|  Mobile  |  pqrs |
+----------+-------+

我尝试使用 REGEXP_SUBSTR

platform 的默认第一个模式出现:

select regexp_substr(my_column, 'test_(.*)_(.*)_(.*)') as platform from table

获取value 的第二个模式出现:

select regexp_substr(my_column, 'test_(.*)_(.*)_(.*)', 1, 2) as value from table

但是,这不起作用。我哪里错了?

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    对于非空令牌

    select  regexp_substr(my_column,'[^_]+',1,2)    as platform
           ,regexp_substr(my_column,'[^_]+',1,3)    as value
    
    from    my_table
    ;
    

    对于可能为空的令牌

    select  regexp_substr(my_column,'^.*?_(.*)?_.*?_.*$',1,1,'',1)  as platform
           ,regexp_substr(my_column,'^.*?_.*?_(.*)?_.*$',1,1,'',1)  as value
    
    from    my_table
    ;
    

    +----------+-------+
    | PLATFORM | VALUE |
    +----------+-------+
    | PC       | xyz   |
    +----------+-------+
    | PC       | pqrs  |
    +----------+-------+
    | Mobile   | pqrs  |
    +----------+-------+
    

    【讨论】:

      【解决方案2】:

      (.*) 本质上是贪婪的,它会匹配包括_ 在内的所有字符,所以test_(.*) 会匹配整个字符串。因此,模式_(.*)_(.*) 中的其他组没有什么可匹配的,整个正则表达式失败。诀窍是匹配除_ 之外的所有字符。这可以通过定义一个组([^_]+) 来完成。该组定义了一个否定字符集,它将匹配除 _ 之外的任何字符。如果您有更好的模式,您可以像[A-Za-z][:alphanum] 一样使用它们。将字符串分割成多个以_ 分隔的子字符串后,只需选择第 2 组和第 3 组即可。

      例如:

      SELECT REGEXP_SUBSTR( my_column,'(([^_]+))',1,2) as platform, REGEXP_SUBSTR( my_column,'(([^_]+))',1,3) as value from table;

      注意:AFAIK 没有直接的方法可以让 Oracle 精确匹配组。您可以为此目的使用 regexp_replace,但它与其他编程语言的功能不同,您可以只精确到第 2 组和第 3 组。例如,请参阅this 链接。

      【讨论】:

        猜你喜欢
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2019-06-10
        • 1970-01-01
        • 1970-01-01
        • 2015-05-13
        • 2013-05-16
        相关资源
        最近更新 更多