Firebird: Soundex

3 - Beispieldatenbank

Download
In der Beispieldatenbank werden Soundex-Spalten in der Tabelle "words" verwendet. Dabei werden die Spalten "wrd_soundex_eng" und "wrd_soundex_ger" über den Trigger "words_BIU0" mit dem passenden Soundex gefüllt. Dazu wird geprüft, ob sich das Feld "wrd_word" geändert hat, oder eventuell noch kein Soundex eingetragen wurde.
CREATE OR ALTER TRIGGER "words_BIU0" FOR "words"
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
DECLARE VARIABLE L_CHANGED "dom_BOOL";
BEGIN

  /* PK eintragen */
  IF (NEW."PK_wrd" IS NULL)
  THEN
    NEW."PK_wrd" = GEN_ID("gen_PK", 1);

  /* auf Änderung des Wortes prüfen */
  IF (COALESCE(NEW."wrd_word", '') <> COALESCE(OLD."wrd_word", ''))
  THEN
    L_CHANGED = 1;
  ELSE
    L_CHANGED = 0;

  /* englischen Soundex eintragen, wenn sich das Wort geändert hat, */
  /* oder noch kein Soundex existiert                               */
  IF ((L_CHANGED = 1) OR (COALESCE(NEW."wrd_soundex_eng", '') = ''))
  THEN
    EXECUTE PROCEDURE "prc_soundex"(NEW."wrd_word", 'ENG')
      RETURNING_VALUES NEW."wrd_soundex_eng";

  /* deutschen Soundex eintragen, wenn sich das Wort geändert hat, */
  /* oder noch kein Soundex existiert                              */
  IF ((L_CHANGED = 1) OR (COALESCE(NEW."wrd_soundex_ger", '') = ''))
  THEN
    EXECUTE PROCEDURE "prc_soundex"(NEW."wrd_word", 'GER', 5)
      RETURNING_VALUES NEW."wrd_soundex_ger";

END

Suche in der Tabelle "words"

Hier wird einmal mit einem englischen und einmal mit einem deutschen Soundex gesucht. Durch den (INNER) JOIN werden nur solche Datensätze selektiert, die den gleichen Soundex haben, den die SP "prc_soundex_list" zurückliefert.
/* Suche nach dem englischen Wort "Search" */
SELECT "PK_wrd", "wrd_word"
  FROM "words"
  JOIN "prc_soundex_list"('Search', 'ENG') ON OUT_SOUNDEX = "wrd_soundex_eng"

/* Suche nach dem deutschen Wort "Suche" */
SELECT "PK_wrd", "wrd_word"
  FROM "words"
  JOIN "prc_soundex_list"('Suche', 'GER') ON OUT_SOUNDEX = "wrd_soundex_ger"