Oracle 12.1 Diakritische Zeichen als Ascii Zeichen darstellen vergleichen

tplanitz

Erfahrenes Mitglied
Hallo Leute,

Ich möchte Diakritische Zeichen in "normale" Zeichen umwandeln.

Der Knackpunkt dabei sind zwei verschiedene Datenbank NLS_Charset Konfigurationen.
Ich kann die Daten aus zwei Datenbanken abfragen und soll diese vergleichen.

Also ich muss aus dem Namen Nguyẽn den Namen Nguyen machen. Also das umwandeln in ein e

Beide Datenbanken können beides enthalten.


Metadaten:
DatenbankNLS_CHARSETSpaltendefinitionSpalteninhalt (NAME)Spalteninhalt nach umwandlung
DB-01(Oracle 12)AL32UTF8NVARCHAR2(45 CHAR)NguyẽnNguyen
DB-02(Oracle 12)WE8ISO8859P15NVARCHAR2(45 CHAR)NguyẽnNguyen


Liste der möglichen diakritischen Zeichen:é ḫ ģ ő ȁ ỷ ď ơ ș ů ā ę ż ñ ë â

Meine Methode um Die Zeichen in DB-01 umzuwandeln funktioniert einwandfrei:

Code:
select 
     'Nguyẽn' as name_diakr
    , utl_raw.cast_to_varchar2((nlssort('Nguyẽn', 'nls_sort=binary_ai'))) as name_norm
from dual

Wenn ich diese Methode auf DB-02 anwende bekomme ich sowas wie das hier: Nguy?n

Konnte ich meine Frage verständlich stellen und hat jemand einen Ansatz wie ich weitermachen kann?

Viele Grüße und ein schönes Wochenende

T.
 

tplanitz

Erfahrenes Mitglied
Hallo,

ich habe es gelöst, ist erstmal nicht elegant aber funktioniert sehr gut.

Der Trick ist, sich über die Methoden translate() oder soundex() zu behelfen.

Beispiel für soundex() habe ich hier kopiert: https://community.oracle.com/tech/developers/discussion/924109/search-the-accented-characters

Beispiel für translate() habe ich hier kopiert: https://community.oracle.com/tech/d...characters-with-accent-with-their-base-letter

Die translate() Methode ist etwas Aufwändig, da man alle Zeichen händig eintragen muss. Wenn jemand eine Liste aller möglichen Diakritischen Zeichen hier mit reinpacken könnte wäre das perfekt.

Code:
with t as (select 'ALKARAKPËI' str from dual
           union all
           select 'DIKPÖR' str from dual)
select str
  from t
 where (soundex (str) = soundex ('ALKERAGPEI'))
       or (soundex (str) = soundex ('DOKPUR'))
;      

SELECT TRANSLATE('xxxxáxxxxñxxáxxñ',
'áñ', 'an')
FROM dual
;

Viele Grüße

T.