Как сравнить выбранные поля двух строк с символами - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь сравнить только определенный раздел данных в каждой строке из разных источников. Ниже приведены данные, которые у меня есть,

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». Если он совпадает с начальным символом столбца имени таблицы (игнорируя число в []) обеих строк, то результат передается. в этом случае в качестве первого символа у нас будет «A», поэтому результатом будет «pass»

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

это то, что я пытаюсь получить, и, поскольку это выглядит слишком сложным для меня, я полностью застрял. Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Я считаю, что следующее тестовое выражение может использоваться для представления вашего бизнес-правила:

REGEXP_LIKE( 
    cellname, 
    '^[^a-zA-Z]*' || REGEXP_SUBSTR( tablename, '[a-zA-Z]{1,3}$' ) 
)

Проверка регулярного выражения tablename соответствует следующей спецификации:

  • любое количество неалфавитных символов в начале строки a (в частности, это разрешает строки, начинающиеся с '[1234...] ')
  • , за которым следуют последние алфавитные символы, найденные в cellname, по крайней мере с одним символом и максимум 3 символами (следовательно, '__A' становится 'A', тогда как 'AAA' остается 'AAA').

В вашем запросе это должно дать:

select t1.*,
CASE 
    WHEN 
            REGEXP_LIKE( t1.cellname, '^[^a-zA-Z]*' || REGEXP_SUBSTR( t1.tablename, '[a-zA-Z]{1,3}$' ) ) 
        AND REGEXP_LIKE( t2.cellname, '^[^a-zA-Z]*' || REGEXP_SUBSTR( t2.tablename, '[a-zA-Z]{1,3}$' ) ) 
    THEN 'pass'
    ELSE 'fail'
END result
FROM mytable t1
INNER JOIN mtable t2 ON t1.cell_name = t2.cell_name AND t2.source = 'SC2'
WHERE t1.source='SRC1';
0 голосов
/ 17 января 2019

Если я правильно понимаю, вы хотите сравнить последние 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'
0 голосов
/ 17 января 2019

Вы можете использовать оператор 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...