フリー テキスト フィールドを解析して国名を検索する SQL UDF またはステートメントを作成しようとしていますが、うまくいきません。
完全なコンテキストを提供するために、トランザクションの詳細を含むトランザクション テーブル (以下の tbltransactions) を用意しました。フィールドの 1 つは、このフリー テキスト フィールドです。これには、受取人の名前、受取人の住所、受取人の国が (この順序で) 含まれていることが理想的です。しかし、フリー テキスト フィールドで予想されるように、あらゆる種類の可能な組み合わせがあります。これは、国名のスペルが間違っている、省略されている、短縮されている、または完全に欠落している可能性があることも意味します。幸いなことに、ほとんどの取引では、テキスト ブロックの最後に国が指定されています。テーブルには、ユーザーが 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
ご覧のとおり、テーブル間に 1 対多のマッピングがあります。目的は、トランザクションを分析し、それが意図された国を見つけることです ( ISO コードだけでなく、主にフリーテキスト フィールドに基づいて)。たとえば、トランザクション 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
このソリューションの構築を手伝っていただければ、本当に感謝しています。初めての投稿なのでルール違反がありましたらご容赦ください。詳細についてはお気軽にお問い合わせください。できるだけ早く投稿します。
よろしくお願いします。
乾杯