Сопоставление 2 полей с разными длинами символов, substr?Перетяжка? - PullRequest
0 голосов
/ 22 сентября 2018

Мне нужно иметь возможность написать SQL для соответствия обычному, где количество символов отличается в разных таблицах.Как вы увидите ниже, таблица 1 имеет CustomerId без дополнения (количество символов может отличаться, как показано в примере).Таблица 2 имеет специальный формат «0001» + заполнение 0, чтобы в поле было всего 30 символов.

Итак, если бы мне нужно было написать SQL для этого, для table1 CustomerIds это был бы какой-то типподстрока?

Пример :.Таблица1 имеет значение «123456».Таблица 2 имеет значение custommerid как «000100000000000000000000123456»

Пример 2: Таблица 1 имеет значение customerid как «98765432» Таблица 2 имеет значение customerid как «000100000000000000000099765432»

Ответы [ 4 ]

0 голосов
/ 22 сентября 2018

Вы также можете использовать функцию ltrim для этого, как запрос ниже, просто обрезая 0 или 1 из customerid таблицы2:

   select * from ns_table2 a,ns_table3 b where 
   ltrim(b.val1,'01')=ltrim(a.val1,'01') ;

пример ввода:

create table ns_table2(val1 varchar(30),val2 varchar(30));
create table ns_table3(val1 varchar(30),val2 varchar(30));

insert into ns_table2 values('123456','table2');
insert into ns_table2 values('98765432','table2');

insert into ns_table3 values('000100000000000000000000123456','table3');
insert into ns_table3 values('000100000000000000000098765432','table3');
select * from ns_table2 a,ns_table3 b where 
ltrim(b.val1,'01')=ltrim(a.val1,'01') ;    

пример вывода:

123456      table2  000100000000000000000000123456  table3
98765432    table2  000100000000000000000098765432  table3
0 голосов
/ 22 сентября 2018
........
where table2.customerID like '%' || table1.customerID

like на самом деле является неправильным, это означает «равно».«%» будет соответствовать произвольной строке любой длины (от нуля или более).

0 голосов
/ 22 сентября 2018

LIKE безусловно, хороший вариант.

Еще один способ, предполагая, что столбцы содержат только числовые символы, вы можете использовать: -

ON ( TO_NUMBER(SUBSTR(tab2.customerid,5)) = tab1.customerid )

Добавление функции на основе INDEX on TO_NUMBER(SUBSTR(tab1.customerid,5) может ускорить запрос.

0 голосов
/ 22 сентября 2018

Вы должны дополнить значение из таблицы1 0001 и обнулять до 30 символов, а затем использовать его для сравнения.

where '0001'||lpad(columnname,'0',26) = columnname2
...