У меня есть таблица SQL с разными адресами. Некоторые адреса имеют в конце пробел. Некоторые адреса с пробелами в конце также содержат оригинал без пробелов.
Это оказывается проблематичным при соединениях, поскольку когда я присоединяюсь к исходному адресу, оба адреса (с пробелами и без пробелов) возвращаются как совпадающие.
Как я могу завершить соединение, чтобы совпадало только точное addressid
?
select a.addressline3, b.[id] addressid1
from addresstable a
left join pii_address b on a.AddressLine3 = b.address
возвращает:
где
select *
from pii_address
where address = ''
возвращает
''
' '
Более явно:
select *
from Parsed_ADP_json..pii_address
where address = '1 FLETCHER HOUSE'
возвращает 1 FLETCHER HOUSE
и 1 FLETCHER HOUSE
, обратите внимание на лишние пробелы в конце.
Наконец, результаты обоих этих поисков одинаковы:
select a.*, b.*
from table1 a
left join pii_address b on a.AddressLine1 = b.address collate SQL_Latin1_General_CP1_CI_AS
where AddressLine1 = '1 FLETCHER HOUSE '
и
select a.*, b.*
from table1 a
left join pii_address b on a.AddressLine1 = b.address collate SQL_Latin1_General_CP1_CI_AS
where AddressLine1 = '1 FLETCHER HOUSE'
НО они разные, когда есть пробелы в начале:
select a.*, b.*
from table1 a
left join pii_address b on a.AddressLine1 = b.address collate SQL_Latin1_General_CP1_CI_AS
where AddressLine1 = ' 1 FLETCHER HOUSE'
@MartinSmith where AddressLine1 LIKE '1 FLETCHER HOUSE ' ESCAPE CHAR(0)
или какой-либо другой escape-символ должен работать, если только ваши данные не очень странные.
SQL Server автоматически игнорирует конечные пробелы. Вы можете проверить эту статью там же здесь
Альтернативный вариант, о котором я мог бы подумать, — это проверка длины данных (а не нормальной длины) вместе с равенством строк. Приведенный пример ниже:
SELECT a.addressline3
,b.[id] addressid1
FROM addresstable a
LEFT JOIN pii_address b
ON a.AddressLine3 = b.address
WHERE DATALENGTH(a.AddressLine3) = DATALENGTH(b.address)
Вы можете включить это условие длины по своему усмотрению.
изменить: использование нескольких условий соединения
SELECT a.addressline3
,b.[id] addressid1
FROM addresstable a
LEFT JOIN pii_address b
ON a.AddressLine3 = b.address
AND DATALENGTH(a.AddressLine3) = DATALENGTH(b.address)
используйте AND
вместо WHERE
, и это работает. Присоединение при обоих условиях работает
@Сэм, пожалуйста, постарайся не «выпрашивать» голоса таким образом.
Вы можете использовать
LIKE
вместо=
, но тогда, если какой-либо из адресов содержит подстановочные знаки, это не будет работать должным образом.