首页 > 解决方案 > 使用正则表达式数据拆分的查询没有得到正确的结果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)$')

标签: sqlregexoracleregexp-substrregexp-like

解决方案


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

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]$它与我的大致相同。


推荐阅读