我试图创建一个SQL UDF或语句来解析自由文本字段并从中找到国家名称,但我无法成功完成此操作。SQL脚本从自由文本字段中提取国家
为了给大家提供完整的上下文,我有一个交易表(下面的tbltransactions),其中包含交易细节,其中一个字段是这个自由文本字段。这应该是理想情况下包含收款人姓名,收款人地址和收款人国家(按此顺序)。但正如你所期望的那样,有一个免费的文本字段,有各种可能的组合。这也意味着一个国家的名称可能会被拼写错误,缩写,缩短或完全丢失。幸运的是,大多数交易都在文本块末尾指定了国家/地区!表中还有另外一个字段,用户输入3个字符的国家代码(强制性)。这可能会或可能与他在自由文本字段中输入的内容不匹配。下面是在表中的虚拟数据:
TransID ISOCode BeneAddress
------------------- -----------
20 IRN aaaa bb cccc Islamic Rupublic of Iran
19 IRN aaaa bb cccc Iran, Islamic Republic of
现在,我做了存储所有国家的列表和它们的名称可能变化的查找表(tblCountryMappings)(以及大部分的!)。
例如, '马其顿共和国', '马其顿,前南斯拉夫共和国 的', '马其顿', '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代码中有“伊拉克”,在自由文本中有“Iran”,自由文本匹配在ISO 3字符“IRN”上。我还需要确保在边界情况下的匹配工作(例如行尾,用引号包围),但不是在文本块的中间(例如,不匹配沙特阿拉伯双字符代码“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
如果你能帮助我建立这个解决方案,它将非常感激。如果我违反了发布规则,请原谅我,因为这是我第一次。随时索取更多信息,我会尽快发布。
非常感谢。
干杯
中感谢这个解决方案@Edmond!工作得很好。你能否告诉我你是如何加入'(T.BeneAddress LIKE'%[,]'+ M.MatchIdentifier +'[,]%')'。我的SQL有点弱,所以无法得到如何加入工作W/O通常A.x = B.x.另外,然后我试着在正则表达式中引入更多的条件来处理引用中的countryname或字符串开头的情况,或者如果freetext只有国家名称没有其他的东西 - 因为目前他们不会返回匹配。我遇到的另一个问题是,它还会针对收款人姓名进行比赛,例如“bb苏丹先生”将返回巴巴多斯和苏丹。谢谢! –
@ V.Asher连接本身与传统连接实际上没什么区别,除了在T.BeneAddres和M.MatchIdentifier之间执行完全匹配之外,它将在与常规定义的模式相匹配时加入T.BeneAddres表达。 我会用一个例子来更新答案,如何在字符串的开头处理引号和国家名称并附加一些解释。不幸的是,由于国名驾驶室位于字符串的开头或结尾,因此对于名称可能与县名相匹配的场景,您可以做的事情并不多。 –
非常感谢!所以如果我正确理解了你的话:'(T.BeneAddress LIKE'%[,]'+ M.MatchIdentifier +'[,]%')'只会在两个字段都包含**','**和'(T .BeneAddress LIKE'%[,]'+ M.MatchIdentifier)'只有在M.MatchIdentifier没有时T.BeneAddress才会加入?对于你提到的最后一点,对于大约90%的记录,国家名称是最后的。干杯! –