Ich versuche eine SQL-UDF oder -Anweisung zu erstellen, um ein freies Textfeld zu analysieren und den Ländernamen zu finden, aber ich kann das nicht erfolgreich durchführen.SQL-Skript zum Extrahieren eines Landes aus dem Freitextfeld
Um Ihnen den vollen Kontext zu geben, habe ich eine Transaktionstabelle (tbltransactions unten), die Transaktionsdetails enthält und eines der Felder ist dieses freie Textfeld. Dies sollte idealerweise enthalten Name des Zahlungsempfängers, Empfängeradresse und Empfängerland (in dieser Reihenfolge). Aber wie Sie es von einem freien Textfeld erwarten, gibt es alle möglichen Kombinationen. Dies bedeutet auch, dass der Name eines Landes falsch geschrieben, abgekürzt, verkürzt oder komplett fehlen könnte. Glücklicherweise haben die meisten Transaktionen Länder am Ende des Textblocks angegeben! Es gibt ein weiteres Feld in der Tabelle, in dem der Benutzer einen dreistelligen Ländercode eingibt (obligatorisch). Dies kann oder kann nicht mit dem entsprechen, was er in das Freitextfeld eingegeben hat. Im Folgenden finden Sie die Dummy-Daten in der Tabelle:
TransID ISOCode BeneAddress
------------------- -----------
20 IRN aaaa bb cccc Islamic Rupublic of Iran
19 IRN aaaa bb cccc Iran, Islamic Republic of
Jetzt habe ich eine Tabelle nachschlagen gemacht (tblCountryMappings), die eine Liste aller Länder und möglichen Variationen ihrer Namen speichert (und die meisten von ihnen!).
Eg. 'Mazedonien, Republik', 'MAZEDONIEN, DIE EHEMALIGE JUGOSLAWISCHE REPUBLIK VON', 'MAZEDONIEN', 'MASEDONIA' usw.
Im Folgenden finden Sie Dummy-Daten für diese Tabelle:
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
Wie Sie kann sehen, es gibt eine Eins-zu-viele-Zuordnung zwischen den Tabellen. Das Ziel Ziel ist in der Lage, die Transaktion zu analysieren und herauszufinden, für welches Land es bestimmt war (in erster Linie basierend auf dem Freitextfeld, nicht nur der ISO-Code). Zum Beispiel sollten wir in der Lage sein zu sehen, dass Transaktion 123 "Irak" im ISO-Code und "Iran" im Freitext hat, und die Freitext-Übereinstimmung war auf dem ISO 3-Zeichen "IRN". Ich muss auch sicherstellen, dass das Matching in Grenzsituationen (z. B. Zeilenende, umgeben von Anführungszeichen) funktioniert, aber nicht, wenn es in der Mitte eines Textblocks steht (z. B. nicht mit dem Saudi-Arabien 2-stelligen Code "SA") jeder nannte "Samuel").
Ich habe dieses grundlegende Skript geschrieben, um das letzte Wort aus Freitext zu extrahieren, und dies könnte dann verwendet werden, um matchIdentifier in tblCountryMappings beizutreten, aber es ist offensichtlich ein extrem schlechter Versuch.
Wenn Sie mir bitte helfen könnten, diese Lösung zu bauen, wird es wirklich geschätzt. Bitte entschuldigen Sie mich, wenn ich irgendwelche Regeln des Postings verletzt habe, da dies das erste Mal ist. Fühlen Sie sich frei, nach weiteren Informationen zu fragen, und ich werde es frühestens veröffentlichen.
Vielen Dank im Voraus.
Prost
Dank für diese Lösung @Edmond! Funktioniert ziemlich gut. Könnten Sie mir bitte sagen, wie Sie beigetreten sind? (T.BeneAddress LIKE '% [,]' + M.MatchIdentifier + '[,]%') '. Meine SQL ist ein bisschen schwach, so konnte nicht wie Joins arbeiten, ohne die übliche A.x = B.x. Auch dann, ich cud versuchen, mehr Bedingungen in der Regex zu berücksichtigen Szenarien wie countryname in Anführungszeichen oder am Anfang der Zeichenfolge oder wenn Freetext hat nur den Namen des Landes nichts anderes - coz zur Zeit geben sie keine Übereinstimmung zurück. Ein weiteres Problem, das mir auffiel, ist, dass es auch ein Spiel gegen die Namen von Zahlungsempfängern gibt, zB "Mr. bb Sudan" wird Barbados und Sudan beide zurückgeben. Danke! –
@ V. Asher der Join selbst ist wirklich nicht viel anders als eine traditionelle Join, außer statt eine genaue Übereinstimmung zwischen T.BeneAddres und M. MatchIdentifier wird es stattdessen die T.BeneAddres beitreten, wenn es mit dem Muster wie durch den regulären übereinstimmt Ausdruck. Ich werde die Antwort mit einem Beispiel zum Umgang mit Anführungszeichen und Ländernamen am Anfang des Strings mit einigen zusätzlichen Erklärungen aktualisieren. Leider kann man bei Szenarien, in denen der Name der Person auch mit einem Kreisnamen übereinstimmen kann, nicht viel tun, da der Name des Landes am Anfang der Zeichenkette oder am Ende steht. –
Vielen Dank! Also, wenn ich dich richtig verstanden habe: '(T.BeneAddress LIKE '% [,]' + M.MatchIdentifier + '[,]%')' wird nur beitreten, wenn beide Felder ** ',' ** und '(T .BeneAddress LIKE '% [,]' + M.MatchIdentifier) 'wird nur beitreten, wenn T.BeneAddress es hat und M.MatchIdentifier nicht? Für das letzte von Ihnen erwähnte Bit, für ~ 90% der Datensätze, ist der Name des Landes am Ende. Prost! –