Я пытаюсь создать SQL UDF или инструкцию для анализа свободного текстового поля и поиска имени страны из него, но я не могу сделать это успешно.SQL-скрипт для извлечения страны из свободного текстового поля
Чтобы предоставить вам полный контекст, у меня есть таблица транзакций (tbltransactions ниже), которая содержит данные транзакции, и одно из полей - это свободное текстовое поле. Это должно быть ideal содержит имя получателя платежа, адрес получателя и страну получателя платежа (в указанном порядке). Но, как и следовало ожидать, в свободном текстовом поле есть всевозможные комбинации. Это также означает, что имя страны может быть неправильно записано, сокращено, сокращено или отсутствует полностью. К счастью, большинство транзакций имеют страны, указанные в конце текстового блока! В таблице есть другое поле, в котором пользователь вводит код страны с тремя символами (обязательно). Это может быть или не соответствовать тому, что он ввел в поле свободного текста. Ниже фиктивные данные в таблице:
TransID ISOCode BeneAddress
------------------- -----------
20 IRN aaaa bb cccc Islamic Rupublic of Iran
19 IRN aaaa bb cccc Iran, Islamic Republic of
Теперь, я сделал справочную таблицу (tblCountryMappings), который хранит список всех стран и возможные варианты их имен (а большинство из них!).
Например. 'Македония, Республика', 'Македония, бывшая югославская Республика OF', 'MACEDONIA', 'MASEDONIA' и т.д.
Ниже фиктивные данные для этой таблицы:
ID ISONumericCode countryName matchIdentifier matchIdentifierType
----------------------------------------------------------------------------------------------
209 364 Iran, Islamic Republic of IR ISOAlphaCode_2
210 364 Iran, Islamic Republic of IRN ISOAlphaCode_3
495 364 Iran, Islamic Republic of Iran Short_Name
1163 364 Iran, Islamic Republic of Iran, Islamic Republic of Original_Name
1309 364 Iran, Islamic Republic of Islamic Rupublic of Iran Alternate_Name
Как вам видно, между таблицами существует сопоставление от одного до многих. Цель - это возможность проанализировать транзакцию и определить, в какой стране она была предназначена (в основном на основе поля свободного текста, а не только код ISO). Например, мы должны уметь видеть, что Transaction 123 имеет «Ирак» в коде ISO, а «Иран» - в свободном тексте, а свободное текстовое совпадение - «IRN» ISO 3-символа. Мне также необходимо убедиться, что сопоставление работает в граничных ситуациях (например, конец строки, окруженный кавычками), но не в том случае, если он находится в середине блока текста (например, не соответствует 2-символьному коду Саудовской Аравии «SA» кого-то называли «Самуил»).
Я написал этот базовый сценарий, чтобы извлечь последнее слово из свободного текста, и тогда его можно будет использовать для объединения matchIdentifier в tblCountryMappings, но это, безусловно, крайне неудачная попытка.
select
beneaddress
,SUBSTRING(beneaddress,
case when CHARINDEX(' ',REVERSE(beneaddress)) = 0 then 1
else LEN(beneaddress) - CHARINDEX(' ',REVERSE(LTRIM(RTRIM(beneaddress))))+2
end
,LEN(beneaddress)) as Country
from
tblTransactions
Если вы могли бы помочь мне построить это решение, оно будет действительно оценено. Пожалуйста, простите меня, если я нарушил какие-либо правила публикации, так как это мой первый раз. Не стесняйтесь спрашивать дополнительную информацию, и я отправлю ее как можно скорее.
Большое спасибо.
Cheers
Спасибо за это решение @Edmond! Работает очень хорошо. Не могли бы вы рассказать мне, как вы присоединились к '(T.BeneAddress LIKE '% [,]' + M.MatchIdentifier + '[,]%')'. Мой sql немного слаб, поэтому не мог получить, как работает объединение без обычного A.x = B.x. Кроме того, тогда я пытаюсь включить дополнительные условия в регулярное выражение для обработки сценариев, таких как countryname в кавычках или в начале строки, или если freetext имеет только имя страны, ничего другого - в настоящее время они не возвращают совпадение. Другая проблема, с которой я столкнулся, заключается в том, что она возвращает совпадение с именами получателей, а также, например, «Mr bb Sudan» вернет Барбадос и Судан. Спасибо! –
@ V.Asher само соединение действительно не сильно отличается от традиционного объединения, вместо того, чтобы выполнять точное совпадение между T.BeneAddres и M.MatchIdentifier, вместо этого он будет присоединяться к T.BeneAddres, когда он будет соответствовать шаблону, как определено регулярным выражение. Я обновлю ответ на пример о том, как обращаться с котировками и названиями стран в начале строки с дополнительным объяснением. К сожалению, вы не можете многое сделать по сценариям, где имя человека также может совпадать с именем графства, так как кабина названия страны находится в начале строки или конца. –
Спасибо большое! Поэтому, если я правильно вас понял: '(T.BeneAddress LIKE '% [,]' + M.MatchIdentifier + '[,]%')' будет объединяться, только если оба поля содержат ** ',' ** и '(T .BeneAddress LIKE '% [,]' + M.MatchIdentifier) 'присоединятся, только если T.BeneAddress имеет его, а M.MatchIdentifier - нет? За последний бит, который вы упомянули, для ~ 90% записей, название страны в конце. Ура! –