特殊字符和从字符串预言机捕获的字符



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

我认为捕获上述内容的最佳方法是使用 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 - 结果 - 与预期不符

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

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

演示

您的正则表达式正在获取(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')

这应该将字符串替换为REGEXP_REPLACE参数中提到的1_2(first_group)_(second_group)

最新更新