我们如何将两行的选定字段与字符进行比较

时间:2019-01-16 21:22:02

标签: sql oracle

我试图比较来自不同来源的每一行中数据的特定部分。以下是我的数据,

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

这是我要尝试得到的东西,因为它对我来说看起来太复杂了,完全陷于困境。请帮忙。

3 个答案:

答案 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的正则表达式检查遵循以下规范:

  • 字符串a开头的任意数量的非字母字符(特别是允许以'[1234...] '开头的字符串)
  • 紧跟在cellname中的最后一个字母字符之后,至少一个字符且最多3个字符(因此,'__A'变成'A',而{{1} }保留为'AAA')。

在您的查询中,应该给出:

'AAA'