【问题标题】:DB Object name capture the last character ending with in oracle db数据库对象名称捕获以 oracle db 结尾的最后一个字符
【发布时间】:2021-02-25 23:27:49
【问题描述】:

我正在尝试捕获第一个字符搜索与最后一个字符,并比较来自 dba_objects 的所有对象名称(表、视图、表分区、同义词...)的总体计数匹配搜索, 我有一个类似的问题来捕获所有对象名称,但在这种情况下是第一个字符,所以我使用了这个查询

为了让我的实际问题简单明了,请在下面找到两个查询

Query1 - 捕获数据库对象的计数 BEGINNING with

拥有者数量 - 70678

object_name 计数 - 121341

object_type - 128322

SELECT
   owner AS schema_name, --70,678
   object_name, --1,21,341
   object_type,--1,28,322
   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;

结果符合预期 - 满意

OBJECT_NAME       BEGINNING COUNT(*) PERCENT
ABC_CUST_INFO_D   ABC       20      .00010
BBC_CUST_ENTRY_F  BBC       100     .030
FHS_PRDCT_STST_T  A$f       194     .031
GHS_INVTR_CD_DRY  A1B       493     .051

Query2 - 捕获 ENDING with 的数据库对象的计数

拥有者数量 - 71881

object_name 计数 - 121341

object_type - 128322

select
   owner,--71,881
   object_name,--1,21,341
   object_type,--1,28,322
   regexp_substr(object_name, '[^_]*$') ENDING,
   count(*) COUNT,
   --count(*) / sum(count(*)) over(partition by owner) ratio 
   round(100*ratio_to_report(count(*)) over (), 4) percentage 
from
   dba_objects 
group by
   owner,
   object_name,
   object_type,
   regexp_substr(object_name, '[^_]*$')
   ORDER BY
   percentage desc;

结果符合预期 - 满意

OBJECT_NAME       ENDING COUNT(*) PERCENT
ABC_CUST_INFO_D   D       20      .00010
BBC_CUST_ENTRY_F  F       100     .030
FHS_PRDCT_STST_T  T       194     .031
GHS_INVTR_CD_DRY  DRY     493     .051

所以在重新访问这两个查询后,我能够比较计数并注意到存在计数差异(1203 个计数),如果我检查计数,有人可以告诉我为什么会有差异只有所有者?

那么请您仔细检查一下,让我知道用于 Query1 和 Query2 的查询逻辑是否正确?

【问题讨论】:

    标签: sql string oracle count


    【解决方案1】:

    您在预期结果中还提到了每个对象名称,您必须使用解析函数如下:

    SELECT OBJECT_NAME,
           Sbstr as ending,
           Count(1) over (partition by sbstr) as "count(*)",
           Count(1) over (partition by sbstr) / Count(1) over () as percentage
    From
    (select
       object_name,
       REGEXP_SUBSTR(OBJECT_NAME, '_([A-Z]+)$',1,1,null,1) as SBSTR
    from
       dba_objects 
    Where 
       REGEXP_LIKE(OBJECT_NAME, '_[A-Z]$') 
    )
    

    注意:这将返回每个以大写字符结尾的对象名称,后跟_。

    【讨论】:

    • 嗨@Tejash 非常感谢您的建议,我已经重新审视了我的问题并使其变得简单,希望这会有所帮助,您能否检查我的 query1 和 query2 并告诉我您的建议?
    【解决方案2】:

    您的要求并不清楚。如果您希望根据每个所有者名称的最后部分(最后一个下划线后面的部分,或者如果根本没有下划线,则为整个名称)计算对象的数量,您可以这样做:

    select owner, regexp_substr(object_name, '[^_]*$') ending, count(*) cnt,
        count(*) / sum(count(*)) over(partition by owner) ratio
    from dba_objects
    group by owner, regexp_substr(object_name, '[^_]*$')
    

    您可以轻松地调整查询以匹配类似的要求:例如,如果您想要按对象类型细分,您可以将 object_type 添加到 selectgroup by 子句,以及添加到 partition by 子句窗口计数。

    请注意,如果您碰巧有名称以下划线结尾的对象,ending 将被计算为空字符串;这可能是,也可能不是你想要的。

    【讨论】:

    • 嗨@GMG 非常感谢您的建议,我重新审视了我的问题并使其变得简单,希望这对您有所帮助,请检查我的查询1和查询2并告诉我您的建议吗?
    猜你喜欢
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多