Модификации соединения со строкой (замена, конкат, обрезка) - PullRequest
0 голосов
/ 13 ноября 2018

Я не могу заставить join работать.У меня есть лишние пробелы и конечный контент, поэтому я подумал, что replace, trim, like и concat (для подстановочного знака) будет работать, но это не так.

Вот пример данных:

create table table1 (name varchar(200));
create table table2 (name varchar(200));
insert into table1 values
('A test: A Value'),
('A test: Another value');
insert into table2 values
('A Value: extra content'),
('Another Value: More content');

Я ожидал, что строка 1 таблицы 1 будет соответствовать строке 1 таблицы 2, и то же самое для строки 2. Они должны совпадать, поскольку содержимое после A test: в таблице 1 соответствует начальному тексту таблицы 2.

Моя попытка была:

select *
from table1 as t1
join table2 as t2
on trim(replace(replace(t1.name, 'A test:', ''), '  ', ' ')) 
like concat(trim(replace(t2.name, '  ', ' ')), '%') 

Это не возвращает совпадений,

http://sqlfiddle.com/#!9/940742/4

1 Ответ

0 голосов
/ 13 ноября 2018

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

в «Значение», например «A».Значение: дополнительное содержимое% '

, поэтому, чтобы заставить его работать, необходимо переключить аргументы так, чтобы условие стало:

on' A Значение: дополнительноеcontent 'вроде' A Value% '

Я полагаю, вы должны изменить предложение join, чтобы% связывалось с t1.name, а не с t2.name.

Thisдолжно работать:

select * 
from table1 as t1 
join table2 as t2
on trim(replace(t2.name, '  ', ' ')) 
like concat(trim(replace(replace(t1.name, 'A test:', ''), '  ', ' ')), '%') ;

См. http://sqlfiddle.com/#!9/940742/23

...