问题描述
我正在尝试将表格分类为各种类别,但无法获得所需的结果,请检查以下查询结果、现有结果以及预期结果
标准
非标准
临时
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)$')
解决方法
如果您真的只需要检查字符串是否以数值结尾(根据您的评论)...
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]$
和我的差不多。