我正在尝试捕获以一些模式开头的表名称并找到每个组的总数,但我特别想捕获,下面是一个例子
我认为捕获上述内容的最佳方法是使用 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)
。