我试图比较来自不同来源的每一行中数据的特定部分。以下是我的数据,
seq_id ID SOURCE Cell name TABLE NAME
1 CT01 SRC1 0097023AE5-557-0182726742-BDCOR-__A [121913] A Table info 20190116 CC
2 CT01 SRC1 0002019609-560-0171464877-MORTR-AAA [121915] AAA Table info 20190116 CC
3 CT01 SRC1 0002018668-560-0171465297-MORTR-AAA [121915] AAA Table info 20190116 CC
4 CT01 SRC1 0003117609-327-0193160029-MORTR-AAA [121915] AAA Table info 20190116 CC
5 CT01 SRC1 0437076AV4-487-0182727650-BDCOR-__A [121913] A Table info 20190116 CC
6 CT01 SRC1 0003114003-400-0179915917-MORTR-AAA [121915] AAA Table info 20190116 CC
7 CT01 SRC1 0008002332-045-0000000001-MORTC-__A [121913] A Table info 20190116 CC
8 CT01 SRC1 091324PBM3-334-0182766417-BDCOR-__A [121913] A Table info 20190116 CC
9 CT01 SRC1 0785592AV8-705-0182772318-BDCOR-BBB [121918] BBB Table info 20190116 CC
10 CT01 SRC2 0097023AE5-557-0182726742-BDCOR-__A [121703] A-FIELD-COMP-20190116
11 CT01 SRC2 0002019609-560-0171464877-MORTR-AAA [121705] AAA-FIELD-COMP-20190116
12 CT01 SRC2 0002018668-560-0171465297-MORTR-AAA [121705] AAA-FIELD-COMP-20190116
13 CT01 SRC2 0003117609-327-0193160029-MORTR-AAA [121705] AAA-FIELD-COMP-20190116
14 CT01 SRC2 0437076AV4-487-0182727650-BDCOR-__A [121703] A-FIELD-COMP-20190116
15 CT01 SRC2 0003114003-400-0179915917-MORTR-AAA [121705] AAA-FIELD-COMP-20190116
16 CT01 SRC2 0008002332-045-0000000001-MORTC-__A [121703] A-FIELD-COMP-20190116
17 CT01 SRC2 091324PBM3-334-0182766417-BDCOR-__A [121703] A-FIELD-COMP-20190116
18 CT01 SRC2 0785592AV8-705-0182772318-BDCOR-BBB [121708] BBB-FIELD-COMP-20190116
在单元名列中,我只需要考虑最后3个字符(例如,“ __ A”,“ BBB”),并检查SRC1和SRC2的表名列中数字之后的第一个字符是否匹配并显示一个结果。
例如-seq_id 1和10需要比较,因为src1和src2的单元名称相同。
seq_id ID SOURCE Cell name TABLE NAME
1 CT01 SRC1 0097023AE5-557-0182726742-BDCOR-__A [121913] A Table info 20190116 CC
10 CT01 SRC2 0097023AE5-557-0182726742-BDCOR-__A [121703] A-FIELD-COMP-20190116
此处单元格名称列的最后一个字符为'__A',即'A'。如果它与两行的表名列的开头字符匹配(忽略[]中的数字),则结果为pass。在这种情况下,我们将“ A”作为第一个字符,因此结果将是“ pass”
seq_id ID SOURCE Cell name result
1 CT01 SRC1 0097023AE5-557-0182726742-BDCOR-__A PASS
这是我要尝试得到的东西,因为它对我来说看起来太复杂了,完全陷于困境。请帮忙。
答案 0 :(得分:1)
如果我正确理解,您想将单元格名称的后3个字符(下划线删除)与表名的第一个空格之后的第一部分进行比较。
要获得最后三个字符减去任何下划线,可以使用此功能select seq_id
, ID
, SOURCE
, Cell_name
, case when regexp_like( table_name
, '^[^\w]* ' ||
ltrim(substr(cell_name,-3),'_') ||
'[- ]')
then 'PASS'
else 'FAIL'
end result
from YourData
,您可以在表名称的正则表达式中使用此功能来检查是否匹配。
select src1.seq_id
, src1.ID
, src1.SOURCE
, src1.Cell_name
, case when regexp_like(src1.table_name,'^[^\w]* '
||ltrim(substr(src1.cell_name,-3),'_')
||'[- ]')
and regexp_like(src2.table_name,'^[^\w]* '
||ltrim(substr(src2.cell_name,-3),'_')
||'[- ]')
then 'PASS'
else 'FAIL'
end result
from YourData src1
join YourData src2
on src1.cell_name = src2.cell_name
and src1.source = 'SRC1'
and src2.source = 'SRC2'
与其他一些响应一样,要确保SRC1和SRC2都匹配,您可以进行自我联接并在case语句中添加第二个条件:
{{1}}
答案 1 :(得分:0)
您可以在同一个表之间应用联接以比较值时使用case语句,这是您要查找的吗?
select a.*,
case
when substr(a.cell_name,length(a.cell_name)-2,3)='__A' and substr a.table_name,10,2)='A ' then 'PASS'
when substr(a.cell_name,length(a.cell_name)-2,3)=substr(a.table_name,10,3) then 'PASS'
else 'FAIL'
end as Result
from have a
inner join have b
on a.cell_name=b.cell_name
and a.seq_id<>b.seq_id
and a.source='SRC1';
答案 2 :(得分:0)
我相信以下测试表达式可以用来代表您的业务规则:
REGEXP_LIKE(
cellname,
'^[^a-zA-Z]*' || REGEXP_SUBSTR( tablename, '[a-zA-Z]{1,3}$' )
)
tablename
的正则表达式检查遵循以下规范:
'[1234...] '
开头的字符串)cellname
中的最后一个字母字符之后,至少一个字符且最多3个字符(因此,'__A'
变成'A'
,而{{1} }保留为'AAA'
)。在您的查询中,应该给出:
'AAA'