【问题标题】:How to remove first 3 and last 5 characters from account column in oracle sql?如何从 oracle sql 中的帐户列中删除前 3 个和后 5 个字符?
【发布时间】:2023-03-22 07:35:01
【问题描述】:

如何从 oracle sql 中的帐户列中删除前 3 个和后 5 个字符?

我有一个专栏帐户。 示例帐号“99k9220000709999” 结果应显示帐号为“92200007”。 需要oracle sql查询。有人可以建议吗?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    substr 应该可以解决问题 - 您从位置 4 开始,将列的长度减去 5+3=8:

    SELECT SUBSTR(mycolumn, 4, LENGTH(mycolumn) - 8)
    FROM   mytable
    

    【讨论】:

    • 非常感谢。达到目的。
    【解决方案2】:

    另一种方法将部分左修剪到字母结束的字符,然后提取没有最后五个字符的剩余字符串

    WITH t(str) AS
    (
     SELECT '99k9220000709999' FROM DUAL
    ), t2 AS
    (
    SELECT regexp_substr(str,'[^[:alpha:]]+$') as str
      FROM t
    )
    SELECT substr( str,1, length(str)-5 ) as "Result"
      FROM t2
    

    【讨论】:

      【解决方案3】:

      您可以使用substr()length()。另一种方法是使用正则表达式:

      select regexp_replace('99k9220000709999', '^.{3}(.*).{5}$', '\1')
      from dual;
      

      但不一定是最有效的方法。

      【讨论】:

      • 目前尚不清楚 OP 对短于 9 个字符的字符串的期望是什么,但这会使字符串保持不变,因为正则表达式将不匹配。
      • @MT0 。 . .我正在寻找一种解决方案,我只引用了一次字符串。
      • ^.{0,3}(.*?).{0,5}$ db<>fiddle
      【解决方案4】:

      如果我们可以让它变得复杂(为了好玩),为什么要让它变得简单?

      SQL> with test (id, account) as
        2    (select 1, '99k9220000709999' from dual union all
        3     select 2, '002LF004828xx'    from dual
        4    ),
        5  split as
        6    (select id,
        7            column_value lvl,
        8            regexp_substr(account, '[^.]', 1, column_value) chr,
        9            max(length(account)) over (order by null) len
       10     from test cross join table(cast(multiset(select level from dual
       11                                              connect by level <= length(account)
       12                                             ) as sys.odcinumberlist))
       13    )
       14  select id,
       15         listagg(chr, '') within group (order by lvl) result
       16  from split
       17  where lvl between 4 and len - 5
       18  group by id;
      
              ID RESULT
      ---------- --------------------
               1 92200007
               2 LF004828
      
      SQL>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 2012-02-10
        • 2014-06-29
        • 1970-01-01
        • 2020-11-12
        • 2011-07-05
        • 1970-01-01
        相关资源
        最近更新 更多