【问题标题】:special characters and characters capture from a string oracle从字符串 oracle 中捕获的特殊字符和字符
【发布时间】:2021-03-04 02:54:11
【问题描述】:

我正在尝试捕获以某些模式开头的表名并找到每个组的总计数,但我特别想捕获,下面是一个示例

我认为捕获上述内容的最佳方法是使用 REGEXP ?

查询 1 - 初始

SELECT
   owner AS schema_name, 
   object_name, 
   object_type,
   REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '\1') as BEGINNING,
   count(*),
   round(100*ratio_to_report(count(*)) over (), 4) percentage 
FROM
   dba_objects 
GROUP BY
   owner,
   object_name,
   object_type,
   REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '\1') 
ORDER BY
   percentage desc;

查询 1 - 现有结果

SCHEMA OBJECT_NAME       OBJECT_TYPE  BEGINNING COUNT(*) PERCENT
STG    AB_01_CUST_ENRLMT TABLE          AB          1    .00001
STG    DKS_SD_PRDCT_DHSS TABLE          DKS         1    .00001
STG    ABC10_CUST_ENRLMT  TABLE         ABC10       1    .00001

查询 1 - 预期结果

 SNO SCHEMA OBJECT_NAME       OBJECT_TYPE  BEGINNING             COUNT(*) PERCENT
  1  STG    AB_01_CUST_ENRLMT TABLE        AB_01                 1       .00001
  2  STG    DKS_SD_PRDCT_DHSS TABLE        DKS_SD                1       .00001
  3  STG    ABC10_CUST_ENRLMT TABLE        ABC10_CUST            1       .00001
  4  STG    #Tableau_6_sid:15 TABLE        #Tableau_6            4000    1.5
  5  STG    /157d_PoI_12 TABLE             /157d_PoI             5000    1.6
  6  STG    JAVA/157d_Ph TABLE             JAVA/157_Ph           5000    1.6
  7  STG    STU$BA_COENT_123 TABLE        STU$BA_COENT           5000    1.5

如何达到预期效果

根据建议我已经合并了以下逻辑并重新运行,不幸的是我没有得到想要的结果

查询 2 - 已修改

SELECT
   owner AS schema_name,
   object_name,
   object_type,
   REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_([A-Z0-9$]{1,})_.*', '\1_\2')as BEGINNING,
   count(*),
   round(100*ratio_to_report(count(*)) over (), 4) percentage 
FROM
   dba_objects 
GROUP BY
   owner,
   object_name,
   object_type,
   REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.([A-Z0-9$]{1,})_.*', '\1_\2')
ORDER BY
   percentage desc;

查询 2 - 结果 - 与预期不符

 SNO SCHEMA OBJECT_NAME       OBJECT_TYPE  BEGINNING           COUNT(*) PERCENT
 1   STG    AB_01_CUST_ENRLMT TABLE        AB_1                  1      .00001
 2   STG    DKS_SD_PRDCT_DHSS TABLE        DKS_D                 1      .00001
 3   STG    ABC_25_ENRLMT     TABLE        ABC_5                 1      .00001
  4  STG    #Tableau_6_sid:15 TABLE        #Tableau_6            4000    1.5
  5  STG    /157d_PoI_12 TABLE             /157d_PoI             5000    1.6
  6  STG    JAVA/157d_Ph TABLE             JAVA/157_Ph           5000    1.6
  7  STG    STU$BA_COENT_123 TABLE        STU$BA_COENT           5000    1.5
 

我需要在 REGEX 逻辑中更正什么? ,我遇到过一些特殊情况

查询 2 - 结果 - 与预期不符

【问题讨论】:

    标签: sql regex oracle regexp-replace regexp-substr


    【解决方案1】:

    REGEXP_REPLACE() 可能适用于两种模式,具体取决于下划线的数量是否小于或等于两个或更多:

    SELECT object_name,
           CASE 
           WHEN REGEXP_COUNT(object_name,'_') <= 2 THEN
                REGEXP_REPLACE(object_name,'(*.)(_.*){1,}(_.*)$', '\1\2')
           ELSE REGEXP_REPLACE(object_name,'^([[:alnum:]]{1,})_([[:alnum:]]{1,}).*', '\1_\2')     
            END AS new_object_name
      FROM user_objects
    

    Demo

    【讨论】:

    • 非常感谢您的逻辑,虽然我正在测试您的逻辑,但我遇到了一些案例,不幸的是#Tableau_6_sid:15251a_4i_2a、/15722c29d_PhotoImageCameraPro 和 JAVA/15722c29d_PhotoImageqeeee,如何处理这些案例?
    • 不客气@rakesh。您期望从新插入的记录#Tableau_6_sid:15251a_4i_2a/15722c29d_PhotoImageCameraProJAVA/15722c29d_PhotoImageqeeee 中返回什么?您可以使用此信息编辑expected results result 部分。
    • ,请检查我已经更新了预期结果部分
    • 我测试过还是遇到新病例,请查看以上病例
    • 您新添加的(STUD$BANK_CONTENTSTU$BA_COENT_123)由于您想要的样式没有问题。例如已经符合@rakesh 提供的模式
    【解决方案2】:

    您的正则表达式正在获取第一次出现的 (char digit) 模式。 那是; ([A-Z0-9$]{1,})

    (...) 大括号用于分组,在 REGEXP_REPLACE 的第三个参数中,您将使用这一组作为整个原始字符串的替换。 还有其他方法可以解决这个问题,但如果您希望继续使用相同的方法,您可以将您的正则表达式扩展到以下内容;

    REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.([A-Z0-9$]{1,})_.*', '\1_\2')
    

    编辑正则表达式;

    REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_([A-Z0-9$]{1,})_.*', '\1_\2')
    

    这应该用(first_group)_(second_group) 替换字符串,在REGEXP_REPLACE 参数中被称为\1_\2

    【讨论】:

    • 谢谢你的解释,不幸的是我使用了上面的逻辑但没有得到想要的结果,我得到 1) DKS_D
    • 你能检查一下我测试过的查询,是不是我在正则表达式中遗漏了什么?
    • 我编辑了我的查询,两个括号组之间不应该有一个点...(...)_.(...)应该是(...)_(...)
    • 非常感谢您的逻辑,虽然我正在测试您的逻辑,但我遇到了一些案例,不幸的是#Tableau_6_sid:15251a_4i_2a、/15722c29d_PhotoImageCameraPro 和 JAVA/15722c29d_PhotoImageqeeee,如何处理这些案例?
    • 您尚未更改查询 2。请使用我编辑的正则表达式重试。删除点。之后让我知道哪种情况有效,哪种情况无效
    猜你喜欢
    • 2016-10-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多