簡體   English   中英

DB Object 名稱捕獲以 oracle db 結尾的最后一個字符

[英]DB Object name capture the last character ending with in oracle db

我正在嘗試捕獲第一個字符搜索與最后一個字符,並比較來自 dba_objects 的所有 Object 名稱(表、視圖、表分區、同義詞...)的總體計數匹配搜索,我有一個類似的問題來捕獲所有object 個名字,但在這種情況下是第一個字符,所以我使用了這個查詢

為了使我的實際問題簡單明了,請在下面找到兩個查詢

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 結尾的數據庫對象的計數

所有者計數- 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 的查詢邏輯是否正確?

你的要求不是明確。 如果您想要,對於每個所有者,根據其名稱的最后部分(最后一個下划線之后的部分,或者如果根本沒有下划線則為整個名稱)計算對象的數量,您可以執行以下操作:

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 類型進行細分,您可以將object_type添加到selectgroup by子句,以及partition by window 計數的子句。

請注意,如果您碰巧有名稱以下划線結尾的對象,則ending將被計算為空字符串; 這可能是,也可能不是你想要的。

您還在預期結果中提到了每個 object 名稱,您必須使用解析 function,如下所示:

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]$') 
)

注意:這將返回每 object 個以大寫字符結尾且后跟 _ 的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM