我正在尝试创建一个 SQL UDF 或语句来解析一个自由文本字段并从中找到国家名称,但我无法成功。
为了给你们提供完整的上下文,我有一个包含交易详细信息的交易表(下面的 tbltransactions),其中一个字段是这个自由文本字段。理想情况下,这应包含收款人姓名、收款人地址和收款人国家/地区(按此顺序)。但正如您对自由文本字段所期望的那样,存在各种可能的组合。这也意味着一个国家的名称可能拼写错误、缩写、缩短或完全丢失。幸运的是,大多数交易都在文本块的末尾指定了国家!表格中有另一个字段,用户在其中输入 3 个字符的国家代码(必填)。这可能与他在自由文本字段中输入的内容匹配,也可能不匹配。下面是表中的虚拟数据:
TransID ISOCode BeneAddress
------------------- -----------
20 IRN aaaa bb cccc Islamic Rupublic of Iran
19 IRN aaaa bb cccc Iran, Islamic Republic of
现在,我制作了一个查找表 (tblCountryMappings),其中存储了所有国家/地区及其名称可能变体的列表(其中大多数!)。
例如。“马其顿共和国”、“马其顿、前南斯拉夫共和国”、“马其顿”、“马其顿”等。
以下是该表的虚拟数据:
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 代码中有“Iraq”,在自由文本中有“Iran”,自由文本匹配在 ISO 3 字符“IRN”上。我还需要确保匹配在边界情况下有效(例如行尾,用引号括起来),但如果它位于文本块的中间(例如不匹配沙特阿拉伯 2 字符代码“SA”到任何叫“塞缪尔”的人)。
我编写了这个基本脚本来从自由文本中提取最后一个单词,然后可以使用它来加入 tblCountryMappings 中的 matchIdentifier ,但这显然是一个非常糟糕的尝试。
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
如果您能帮助我构建此解决方案,我们将不胜感激。如果我违反了任何发帖规则,请原谅我,因为这是我第一次。随时询问更多信息,我会尽快发布。
提前非常感谢。
干杯