【问题标题】:How to create new column based on values after "/" in other column in Oracle?如何根据Oracle中其他列中“/”之后的值创建新列?
【发布时间】:2022-01-12 13:21:27
【问题描述】:

我在 Oracle 中有带有“col1”的表:

col1
------
email1.com/GGR2
pokmail.com/AA
rrajd.com.nl/RRe2

我需要使用“/”之后的值创建“col2”。因此,我需要以下内容:

col1              | col2
--------------------------
email1.com/GGR2   |GGR2
pokmail.com/AA    |AA
rrajd.com.nl/RRe2 |RRe2

我如何在 Oracle 中做到这一点?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    正则表达式或substr + instr

    SQL> with test (col1) as
      2    (select 'email1.com/GGR2' from dual union all
      3     select 'pokmail.com/AA'  from dual union all
      4     select 'rrajd.com.nl/RRe2' from dual
      5    )
      6  select col1,
      7         regexp_substr(col1, '\w+$') col2_first,
      8         --
      9         substr(col1, instr(col1, '/') + 1) col2_second
     10  from test;
    
    COL1              COL2_FIRST        COL2_SECOND
    ----------------- ----------------- -----------------
    email1.com/GGR2   GGR2              GGR2
    pokmail.com/AA    AA                AA
    rrajd.com.nl/RRe2 RRe2              RRe2
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      你可以使用:

      SELECT col1,
             CASE INSTR(col1, '/')
             WHEN 0
             THEN NULL
             ELSE SUBSTR(col1, INSTR(col1, '/') + 1)
             END AS col2
      FROM   table_name;
      

      或者,使用(较慢的)正则表达式:

      SELECT col1,
             REGEXP_SUBSTR(col1, '/(.*)', 1, 1, NULL, 1) AS re_col2
      FROM   table_name;
      

      其中,对于样本数据:

      CREATE TABLE table_name (col1) AS
      SELECT 'email1.com/GGR2'   FROM DUAL UNION ALL
      SELECT 'pokmail.com/AA'    FROM DUAL UNION ALL
      SELECT 'rrajd.com.nl/RRe2' FROM DUAL UNION ALL
      SELECT 'example.com/ab/cd' FROM DUAL UNION ALL
      SELECT 'example.com'       FROM DUAL;
      

      输出:

      COL1 COL2
      email1.com/GGR2 GGR2
      pokmail.com/AA AA
      rrajd.com.nl/RRe2 RRe2
      example.com ab/cd
      example.com

      注意事项:

      • 即使该列不包含/ 字符,这也将起作用。
      • 如果您只使用SUBSTR(col1, INSTR(col1, '/') + 1) 并且字符串不包含/,那么它将返回所有内容而不是返回NULL
      • 如果您使用REGEXP_SUBSTR(col1, '\w+$') 并且字符串不包含或包含多个/ 字符(或任何其他非单词字符),则它不会返回第一个/ 之后的子字符串。

      比较输出:

      SELECT col1,
             CASE INSTR(col1, '/')
             WHEN 0
             THEN NULL
             ELSE SUBSTR(col1, INSTR(col1, '/') + 1)
             END AS col2a,
             REGEXP_SUBSTR(col1, '/(.*)', 1, 1, NULL, 1) AS col2b,
             SUBSTR(col1, INSTR(col1, '/') + 1) AS col2c,
             REGEXP_SUBSTR(col1, '\w+$') AS col2d
      FROM   table_name;
      

      输出:

      COL1 COL2A COL2B COL2C COL2D
      email1.com/GGR2 GGR2 GGR2 GGR2 GGR2
      pokmail.com/AA AA AA AA AA
      rrajd.com.nl/RRe2 RRe2 RRe2 RRe2 RRe2
      example.com/ab/cd ab/cd ab/cd ab/cd cd
      example.com example.com com

      db小提琴here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-04
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        相关资源
        最近更新 更多