首页 > 解决方案 > 我们如何将两行的选定字段与字符进行比较

问题描述

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

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

在 cellname 列中,我只需要考虑最后 3 个字符(例如,“__A”、“BBB”)并检查 SRC1 和 SRC2 的 tablename 列中的数字之后的第一个字符是否匹配并显示结果。

例如 - 需要比较 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

这里 cellname 列中的最后一个字符是“__A”,即“A”。如果它与两行的表名列的开头字符(忽略[]内的数字)匹配,则结果为通过。在这种情况下,我们将“A”作为第一个字符,因此结果将是“通过”

seq_id  ID  SOURCE  Cell name                        result
1   CT01    SRC1    0097023AE5-557-0182726742-BDCOR-__A   PASS

这是我想要得到的东西,因为它看起来对我来说太复杂了,我完全被卡住了。请帮忙。

标签: sqloracle

解决方案


如果我理解正确,您希望将单元格名称的最后 3 个字符与删除的下划线与第一个空格后面的表名称的第一部分进行比较。

要使最后三个字符减去任何下划线,您可以使用此函数trim(substr("Cell name",-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

与确保 SRC1 和 SRC2 匹配的其他一些响应一样,您可以进行自联接并在 case 语句中添加第二个条件:

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'

推荐阅读