【问题标题】:Select dynamic pattern matching string from a column in oracle从oracle中的列中选择动态模式匹配字符串
【发布时间】:2023-04-07 23:41:01
【问题描述】:

我在 oracle 中进行查询,其中我必须使用 col1 中指定的 col1 更新 col2,因此 col1 中的数据是动态的,即可以有任何没有。 / 的 所以我想... Col2 被更新为 col1 的最后一个斜线的修剪值。

输入

Col1        Col2
a          data
a/bb        data
a/b/c      data
a/bbc/c/d/    data

输出

   Col1        Col2
    a          data
    a/b        data/a
    a/b/c      data/a/b
    a/bbc/c/d/    data/a/bbc/c

我尝试使用 regexp_substr 来实现它,但它是动态的。我的查询仅适用于一两个斜杠,例如 [^/]{1}

所以,帮我动态地做吧

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以使用INSTR 查找最后一次出现的字符并使用SUBSTR 删除它:

    SQL Fiddle

    Oracle 11g R2 架构设置

    CREATE TABLE table_name ( Col1, Col2 ) AS
    SELECT 'a',          'data' FROM DUAL UNION ALL
    SELECT 'a/b',        'data' FROM DUAL UNION ALL
    SELECT 'a/b/c',      'data' FROM DUAL UNION ALL
    SELECT 'a/b/c/d',    'data' FROM DUAL UNION ALL
    SELECT 'a/b/c/d/ef', 'data' FROM DUAL;
    

    查询 1

    SELECT col1,
           RTRIM(
             col2 || '/' || SUBSTR( col1, 1, INSTR( col1, '/', -1 ) - 1 ),
             '/'
           ) AS col2
    FROM   table_name
    

    Results

    |       COL1 |         COL2 |
    |------------|--------------|
    |          a |         data |
    |        a/b |       data/a |
    |      a/b/c |     data/a/b |
    |    a/b/c/d |   data/a/b/c |
    | a/b/c/d/ef | data/a/b/c/d |
    

    【讨论】:

    • Thanx MTO .. 它工作了,但是有一点更新只要看看我更新的输入和输出,如果会有像 row4 这样的情况,那么最后一个斜线将如何被修剪
    • @steve 将col1 都替换为RTRIM( col1, '/' ) - SQLFIDDLE
    • Thankx mam@mt0 我把 rtrim 放在了 instr 里面,它工作了......我还在 substr 之外添加了一个替换函数来替换 '/' 到 '\'
    【解决方案2】:

    对于您给定的数据,这可以满足您的需求:

    update t
        set col2 = col2 || '/' || substr(col1, 1, -2);
    

    不过,我怀疑这可能不是您正在寻找的通用解决方案。

    编辑:

    我一直认为应该有更好的方法,但这应该可行:

    update t
        set col2 = col2 || '/' || substr(col1, 1, length(col1) - coalesce(length(regexp_substr(col1, '/[^/]*$', 1, 1)), 0));
    

    是的,更简单的版本是:

    update t
        set col2 = col2 || '/' || regexp_replace(col1, '/[^/]*$', '')
    

    【讨论】:

    • 嘿,戈登,你能详细说明一下这个 regexp_replace(col1, '/[^/]*$', '') 部分……我没有完全理解
    • @steve 。 . .它搜索最后一个正斜杠及其后面的所有字符。
    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多