sql #sql-server #function #text
#sql #sql-сервер #функция #текст
Вопрос:
Я работаю в SSMS версии 18.2.
Я сравниваю некоторые беспорядочные адреса, чтобы увидеть, совпадают ли они по существу. Я получаю адрес в виде 4 отдельных столбцов: адресная строка1, адресная строка2, адресная строка3 и адресная строка4. Я пытаюсь сравнить этот адрес с адресом, введенным вручную. Часто адреса похожи, но набранный вручную может содержать орфографические ошибки или быть сокращенной версией полного адреса. Я объединил адресную строку 1-4 в одну строку и удалил все пробелы:
REPLACE(CONCAT(AddressLine1,AddressLine2,AddressLine3,AddressLine4),' ','') AS CorrectedAddress
Затем я пытаюсь сравнить этот адрес с введенным вручную адресом, который я привел в порядок:
REPLACE(ManualAddress,' ','') AS TidyManualAddress
Я пытаюсь найти наилучший способ сравнить их. По сути, я хотел бы сказать, что если где бы текст в TidyManual Адрес не отображался в CorrectedAddress, тогда Y else N.
Я попробовал следующее:
CASE WHEN SUBSTRING(TidyManualAddress,1,8) = SUBSTRING(CorrectedAddress,1,8) THEN 'Y' ELSE 'N' END AS AddressMatch
Однако выбор из 8 символов в функции substring выбирается произвольно.
Есть ли способ сравнить два столбца, чтобы увидеть, найдена ли строка из одного столбца в другом?
В качестве примера, если мой исправленный адрес — MovingPlace, MakeUpTown, SomeCountry, а мой ручной адрес — MovingPlace, я хотел бы вернуть yes, поскольку MovingPlace находится в строке в первом столбце. Моя проблема, очевидно, заключается в разной длине текста каждой строки.
Комментарии:
1. Примерные данные очень помогли бы вашему вопросу.
2. Что-то вроде этого :
SQL CASE WHEN CorrectedAddress LIKE '%' TidyManualAddress '%' THEN 'Y' ELSE 'N' END AS AddressMatch
?
Ответ №1:
Используйте CHARINDEX()
:
SELECT
CASE
WHEN CHARINDEX(TidyManual, CorrectedAddress) = 0 THEN 'N'
ELSE 'Y'
END AS MATCH