【问题标题】:Query to split using Regexp data split not getting correct result oracle SQL使用正则表达式数据拆分查询拆分没有得到正确的结果oracle SQL
【发布时间】:2021-01-12 16:57:44
【问题描述】:

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

标准

非标准

临时

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

【问题讨论】:

  • 请将您的测试用例的数据发布在 DDL(create table) 和 DML(insert) 语句中,以便我们更好地帮助您。另外,请记住发布数据库版本。最后,解释支持所需输出的规则。
  • 1)。您在查询 ('^W(S[CP]?|T)_.+_([A-Z$])$') 和最后的问题 ('^D(S[CP]?|T)_.+_([A-Z$])$') 中的正则表达式不匹配。 2)。你实际上并没有解释你想要正则表达式检查什么逻辑。
  • @LalitKumarB - 这是 DBA_OBJECTS 表,它是通用表,因此结构保持不变,Oracle DB - Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit
  • @MatBailie - 基本上如果表格结尾是数字,那么它必须被归类为 NON_STANDARD
  • @rakesh 1. 即使是元数据表,结构也没有必要保持不变,因为它取决于 Oracle 版本。 2. 我们没有您的数据,因此您必须遵守发布规则。 3. 解释支持你想要的输出的规则。否则,你可能会得到一半的答案,这对你没有帮助。

标签: sql regex oracle regexp-substr regexp-like


【解决方案1】:

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

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

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

编辑:

您在下方的评论暗示如果表名不是以DSC_DSP_DT_ 开头,那么结果应该是@987654327 @。检查是否存在的最简单方法是(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]$ 和我的差不多。

【讨论】:

  • 之所以选择 WHEN REGEXP_LIKE(OBJECT_NAME, '^D(S[CP]?|T)_.+_([A-Z$])$') 这是因为有表组( DS,DSC,DT) 所以这是必须的 '^D(S[CP]?|T)_
  • @rakesh - 那么您的评论不完整。请使用您希望正则表达式检查的准确且完整的规则集更新您的问题。
  • 在某些情况下,如果表具有 TEMP/TMP,它不会考虑将其分类为 STANDARD 的 case 语句,但预期结果是 'TEMPORARY'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多