Запретить SQL сопоставлять конечные пробелы и вместо этого явно сопоставлять условие

У меня есть таблица 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'

Вы можете использовать LIKE вместо =, но тогда, если какой-либо из адресов содержит подстановочные знаки, это не будет работать должным образом.

Martin Smith 24.06.2024 18:10

@MartinSmith where AddressLine1 LIKE '1 FLETCHER HOUSE ' ESCAPE CHAR(0) или какой-либо другой escape-символ должен работать, если только ваши данные не очень странные.

Charlieface 24.06.2024 18:13
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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, и это работает. Присоединение при обоих условиях работает

frank 24.06.2024 18:08

@Сэм, пожалуйста, постарайся не «выпрашивать» голоса таким образом.

Mark Schultheiss 24.06.2024 18:14

Другие вопросы по теме