【问题标题】:Oracle Remove part of string after a specific occurrence of a characterOracle 在特定字符出现后删除部分字符串
【发布时间】:2020-12-06 17:45:43
【问题描述】:

我试图在倒数第二次出现“_”字符之前获取一个字符串:

例如:

 LORIK_BB_ID_FF_KKK_HUY_222_44
 LUN_GGG_MAMA_FF_GG_GG_TT22_3

获取这部分(考虑到字符串将总是有4个或更多下划线,并且每条记录的下划线数量相同):

LORIK_BB_ID_FF_KKK_HUY
LUN_GGG_MAMA_FF_GG_GG

我已经尝试过使用:

select SUBSTR('LORIK_BB_ID_FF_KKK_HUY',0, (INSTR ('LORIK_BB_ID_FF_KKK_HUY', '_', -1)) - 1) from dual;

这似乎是在最后一次出现'_'之前获取每个字符,我似乎找不到解决方案来获取倒数第二次出现下划线之前的字符。

【问题讨论】:

    标签: sql oracle substring oracle12c


    【解决方案1】:

    REGEXP_SUBSTR 可用于使用组将字符串分成两部分。第一组是直到但不包括倒数第二个下划线的字符串,第二组是倒数第二个下划线和该行的其余部分,直到最后(允许下划线之间有任意数量的字符)。返回第一组。

    WITH T(ID,str) AS
    (
     SELECT 1, 'LORIK_BB_ID_FF_KKK_HUY_222_44' FROM dual UNION ALL
     SELECT 2, 'LUN_GGG_MAMA_FF_GG_GG_TT22_3'  FROM dual 
    )  
    SELECT ID,
    REGEXP_SUBSTR(str, '(.*)(_.*_.*$)', 1, 1, NULL, 1) mystring
    from t;
    
            ID MYSTRING                     
    ---------- -----------------------------
             1 LORIK_BB_ID_FF_KKK_HUY       
             2 LUN_GGG_MAMA_FF_GG_GG        
    
    2 rows selected. 
    

    【讨论】:

      【解决方案2】:

      下划线可能被计算为REGEXP_COUNT(str,'_') - 1 次而不是REGEXP_COUNT(str,'_') + 1,这是由下划线分割的子字符串的数量,并使用LISTAGG(...,'_')... 函数将所有子字符串连接起来,以使子字符串达到倒数第二个下划线:

      WITH t(ID,str) AS
      (
       SELECT 1, 'LORIK_BB_ID_FF_KKK_HUY_222_44' FROM dual UNION ALL
       SELECT 2, 'LUN_GGG_MAMA_FF_GG_GG_TT22_3'  FROM dual 
      )  
       SELECT ID,
              LISTAGG(REGEXP_SUBSTR(str,'[^_]+',1,level),'_')
              WITHIN GROUP (ORDER BY level) AS "Result String"
         FROM t
      CONNECT BY level <= REGEXP_COUNT(str,'_') - 1
          AND PRIOR SYS_GUID() IS NOT NULL
          AND PRIOR ID = ID
        GROUP BY ID;
      
      
      ID  Result String
      --  ----------------------
      1   LORIK_BB_ID_FF_KKK_HUY
      2   LUN_GGG_MAMA_FF_GG_GG
      

      Demo

      【讨论】:

        【解决方案3】:

        你为什么不试试这个:

         select SUBSTR('LUN_GGG_MAMA_FF_GG_GG_TT22_3',0, (INSTR ('LUN_GGG_MAMA_FF_GG_GG_TT22_3', '_', -1, 2)) - 1) from dual;
        
        select SUBSTR('LORIK_BB_ID_FF_KKK_HUY_222_44',0, (INSTR ('LORIK_BB_ID_FF_KKK_HUY_222_44', '_', -1, 2)) - 1) from dual;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-14
          • 2013-08-05
          • 2020-06-17
          • 2014-07-03
          • 1970-01-01
          相关资源
          最近更新 更多