使用正则表达式数据拆分的查询未获得正确的结果 oracle SQL

我正在尝试将表格分类为各种类别,但无法获得所需的结果,请检查以下查询结果、现有结果以及预期结果

标准

非标准

临时

TO_BE_DROPPED

SELECT OWNER,OBJECT_NAME,REGEXP_REPLACE(OBJECT_NAME,'^([A-Z0-9$]{1,})_([A-Z0-9$]{1,})_.*','\1_\2')AS  BEGINNING,REGEXP_SUBSTR(OBJECT_NAME,'[^_]*$') AS ENDING,CASE       
    WHEN REGEXP_LIKE(OBJECT_NAME,'^D(S[CP]?|T)_.+_(T|(W0?[123]?))$')        
   THEN          
     'STANDARD'          
     WHEN REGEXP_LIKE(OBJECT_NAME,'^DB_.+_(D|F|T|W|W1|W2|W3)$')         
       THEN  
     'STANDARD'          
     WHEN REGEXP_LIKE(OBJECT_NAME,'^DE_.+_(D|F|L|T|W|W01|W02|W03|W1|W2|W3)$')       
  THEN       
     'STANDARD'      
     WHEN OBJECT_NAME LIKE 'TBD%'        
    THEN  
        'TO_BE_DROPPED'  
     WHEN OBJECT_NAME LIKE 'TMP%'        
     THEN 'TEMPORARY_TABLE'      
     WHEN REGEXP_LIKE(OBJECT_NAME,'^DA_.+_(D|F|L|T|W|W01|W02|W03|W1|W2|W3|A|AD|AM|AQ|AY)$')         
   THEN          
     'STANDARD'          
     ELSE 'NON_STANDARD'         
   END       
   AS TABLE_CLASSIFICATION        
FROM   DBA_OBJECTS
WHERE  OWNER IN ('DI_ABC')  
       AND OBJECT_TYPE = 'TABLE'
GROUP  BY OWNER,OBJECT_NAME        
ORDER  BY OWNER DESC,OBJECT_NAME;

现有结果

snO OWNER  OBJECT_NAME        BEGINNING ENDING  TABLE_CLASSIFICATION 
01  DI_SCC DSC_02_CUST_ORD    DSC_02    ORD      NON_STANDARD
02  DI_SCC DSC_02_CUST_ORD_T  DSC_02    T        NON_STANDARD
03  DI_SCC DSC_02_CUST_ORD_W  DSC_02    W        NON_STANDARD
04  DI_SCC DSC_02_CUST_ORD1   DSC_02    ORD1     NON_STANDARD
05  DI_SCC DSC_02_CUST_ORD_4  DSC_02    4        NON_STANDARD
06  DI_SCC DSP_03_CUST_SHP    DSP_03    SHP      NON_STANDARD
07  DI_SCC DSP_03_CUST_SHP_T  DSP_03    T        NON_STANDARD
08  DI_SCC DSP_03_CUST_SHP_W  DSP_03    W        NON_STANDARD
09  DI_SCC DSP_03_CUST_SHP9   DSP_03    SHP9     NON_STANDARD
10  DI_SCC DSP_03_CUST_SHP_62 DSP_03    62       NON_STANDARD
14  DI_SCC DT_CUST_WRD        DT        WRD      NON_STANDARD
15  DI_SCC DT_CUST_WRD_T      DT        T        NON_STANDARD
16  DI_SCC DT_CUST_WRD_W      DT        W        NON_STANDARD
17  DI_SCC DT_CUST_WRD5       DT        WRD5     NON_STANDARD
18  DI_SCC DT_CUST_WRD_8      DT        8        NON_STANDARD
19  DI_SCC DT_CUST_WRD23      DT        WRD23    NON_STANDARD

预期结果

snO OWNER  OBJECT_NAME        BEGINNING ENDING  TABLE_CLASSIFICATION 
01  DI_SCC DSC_02_CUST_ORD    DSC_02    ORD      STANDARD
02  DI_SCC DSC_02_CUST_ORD_T  DSC_02    T        STANDARD
03  DI_SCC DSC_02_CUST_ORD_W  DSC_02    W        STANDARD
04  DI_SCC DSC_02_CUST_ORD1   DSC_02    ORD1     NON_STANDARD
05  DI_SCC DSC_02_CUST_ORD_4  DSC_02    4        NON_STANDARD
06  DI_SCC DSP_03_CUST_SHP    DSP_03    SHP      STANDARD
07  DI_SCC DSP_03_CUST_SHP_T  DSP_03    T        STANDARD
08  DI_SCC DSP_03_CUST_SHP_W  DSP_03    W        STANDARD
09  DI_SCC DSP_03_CUST_SHP9   DSP_03    SHP9     NON_STANDARD
10  DI_SCC DSP_03_CUST_SHP_62 DSP_03    62       NON_STANDARD
14  DI_SCC DT_CUST_WRD        DT        WRD      STANDARD
15  DI_SCC DT_CUST_WRD_T      DT        T        STANDARD
16  DI_SCC DT_CUST_WRD_W      DT        W        STANDARD
17  DI_SCC DT_CUST_WRD5       DT        WRD5     NON_STANDARD
18  DI_SCC DT_CUST_WRD_8      DT        8        NON_STANDARD
19  DI_SCC DT_CUST_WRD23      DT        WRD23    NON_STANDARD

我正在尝试纠正它以获得预期的结果,我需要纠正什么?

WHEN REGEXP_LIKE(OBJECT_NAME,'^D(S[CP]?|T)_.+_([A-Z$])$')  

有什么建议必须在上面的 reg ex 语句中修改吗?

--this case statement is for schema - DI_STAGE
WHEN REGEXP_LIKE(OBJECT_NAME,'^D(S[CP]?|T)_.+_(T|(W0?[123]?))$')
--this case statement is for schema - DI_ODS
WHEN REGEXP_LIKE(OBJECT_NAME,'^DB_.+_(D|F|T|W|W1|W2|W3)$')
--this case statement is for schema - DI_EDW
WHEN REGEXP_LIKE(OBJECT_NAME,'^DE_.+_(D|F|L|T|W|W01|W02|W03|W1|W2|W3)$')   
--this case statement is for schema - DI_MART
WHEN REGEXP_LIKE(OBJECT_NAME,'^DE_.+_(D|F|L|T|W|W01|W02|W03|W1|W2|W3)$')
'^DA_.+_(D|F|L|T|W|W01|W02|W03|W1|W2|W3|A|AD|AM|AQ|AY)$')
gaoshen975 回答:使用正则表达式数据拆分的查询未获得正确的结果 oracle SQL

如果您真的只需要检查字符串是否以数值结尾(根据您的评论)...

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=66a0e1d6180f3eb1c3b80c06763e8654

CASE WHEN NOT REGEXP_LIKE(OBJECTNAME,'[0-9]+$') THEN 'STANDARD' ELSE 'OTHER' END

编辑:

您在下面的评论暗示如果表名不以 DSC_DSP_DT_ 开头,则结果应该是NONSTANDARD。检查是否存在的最简单方法是 (DSC|DSP|DT)\_

这让我...

CASE WHEN REGEXP_LIKE(OBJECTNAME,'^(DSP|DSC|DT)\_(.)*[A-Z]$') THEN 'STANDARD' ELSE 'OTHER' END

要成为STANDARD,必须满足以下所有条件

  • 必须以 DSC_DSP_DT_ 开头
  • 必须以大写字母结尾

在您的问题通过一组更完整和更准确的要求得到澄清之前,这只是我对您要实现的目标的最佳猜测

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=56bdf881655ec8cd3292931303b86ea1

编辑:

我和你的例子之间的主要区别是你有两次 $ ......

  • ([A-Z$])$

因此,需要两个“行尾”。

把它改成 [A-Z]$ 和我的差不多。

本文链接:https://www.f2er.com/1113054.html

大家都在问