Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Wie nach substrings suchen?

Dieses Thema im Forum "SQLite" wurde erstellt von datenbeisser, 2 April 2014.

  1. datenbeisser

    datenbeisser Aktiver Benutzer

    Hallo,

    in einer gegebenen SQLite v3.8.4 Ortsdatenbank sind im Datenbankfeld "OrtMulti" alle internationalen Bezeichnungen eines Ortes verzeichnet. Es soll jedoch nur nach der deutschen Ortsbezeichnung gesucht werden.

    An welcher Stelle ein jeweils gesuchter deutscher Ortsname im Feld "OrtMulti" zu finden ist. läßt sich leider nicht sagen.

    Beispiel SQL Suche nach deutschem Ortsnamen:
    SELECT Data.OrtMulti FROM Data WHERE Data.OrtMulti LIKE '%,Neu-Delhi,%'

    Ergebnis:
    Dellium Novum,Dilli,Dillí,N'ju-Deli,Neo Delchi,Neu-Delhi,Nev Deli,New Delhi,New Dilli,Nju Delkhi,Nov-Delhio,Nova Delhi,Nova Deli,Nova Deli - na'i dilli,Nova Deli - नई दिल्ली,Nova-Delhi,Nove Dilli,Nové Dillí,Nueba Deli,Nueva Delhi,Nuova Delhi,Nyja Deli...

    Gibt es eine Möglichkeit als Ergebnis nur: "Neu-Delhi" zu erhalten? Mit welchen SQL Befehlen läßt sich das bewerkstelligen?

    Grüße,
    Datenbeisser
     
  2. Hony%

    Hony% Datenbank-Guru

    Hi.
    Klar.
    Code:
    SELECT substr(Data.OrtMulti, instr( Data.OrtMulti, 'Neu-Delhi' ), length( 'Neu-Delhi' ))
    FROM Data
    WHERE Data.OrtMulti LIKE '%,Neu-Delhi,%'
    Die Core-Functions sind da recht nützlich. ;)

    Gruß
    Hony
     
    datenbeisser gefällt das.
  3. datenbeisser

    datenbeisser Aktiver Benutzer

    Danke für die detailierte Antwort!

    Leider funktioniert der SQL Befehl nicht. Da muß noch irgendwo ein kleiner Fehler drin stecken. Ist der "instr" Befehl elementar für die Funktion, oder ließe sich der zu Testzwecken weglassen?
     
    Zuletzt bearbeitet: 2 April 2014
  4. datenbeisser

    datenbeisser Aktiver Benutzer

    Dieser verkürzte SQL Befehl funktioniert aber:

    SELECT substr(Data.OrtMulti, 48, 9)
    FROM Data
    WHERE Data.OrtMulti LIKE '%,Neu-Delhi,%'

    Ergebis: "Neu-Delhi"

    Irgendetwas stimmte also mit dem instr() Befehl nicht. Den werde ich mir mal genauer anschauen. Dann finde ich sicher selbst zum Ergebnis.

    Vielen Dank für die Hilfe!
     
  5. datenbeisser

    datenbeisser Aktiver Benutzer

    Hallo Hony,

    Sorry Dein SQL Befehl funktioniert doch einwandfrei!

    Hatte ihn zuerst mit phpLiteAdmin v1.9.5 ausprobiert und da lief er nicht. Da auch ich keinen Fehler finden konnte, habe ich es noch einmal über ein anderes Programm versucht und es läuft einwandfrei!

    Nochmals vielen Dank!
     
    Hony% gefällt das.
  6. akretschmer

    akretschmer Datenbank-Guru

    Ähm, ich muß hier mal fragen: ist das nicht ein komplett kapottes Design?
     
    datenbeisser gefällt das.
  7. datenbeisser

    datenbeisser Aktiver Benutzer

    Hallo!
    Es funktioniert zumindest und ich verstehe die SQL Befehle. Als Anfänger kann ich leider das Design nicht beurteilen. Wie würdest Du denn die Aufgabe lösen?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Normalisieren. Das wäre dann eine extra Tabelle, die für einen Ort (ID_ORT) und Sprache (ID_SPRACHE) den Namen dann enthält.

    Eine Suche nach dem deutschen Namen eines Ortes ist dann trivial, Du hast ja dann die jeweiligen id-Werte.
     
  9. datenbeisser

    datenbeisser Aktiver Benutzer

    Leider ist das Design der Datenbank vorgegeben. Darin sind insgesamt mehr als 3 Millionen Datensätze vorhanden. Quelle ist http://www.geonames.org in Form einer CSV-Datenbank, die ich in eine SQLite Datenbank konvertiert habe.

    Orte, die ja international viele verschiedene Namen haben, werden darin in einer zusätzlichen Spalte "OrtMulti" gelistet - u.a. auch die deutschen Namen außerhalb Deutschlands, Österreichs und der Schweiz. Siehe oben in meinem Eingangsposting unter "Ergebnis".

    Das läßt sich wohl bei einer internationalen Datenbank nicht anders machen. Ich hätte mir die deutschen Ortsnamen auch leichter zugänglich gewünscht.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Dein Problem.

    Das Grundproblem ist halt, daß Du so nicht effektiv suchen kannst, wenn die Daten nicht normalisiert sind. So eine Suche in einem Textfeld, also dieses substring() - Geschwür, ist teuer und ineffizient.
     
  11. Hony%

    Hony% Datenbank-Guru

    Und ich hab mich schon gewundert was du mit einer solchen Konstruktion willst. Der Code um die Ausgabe anzupassen funktioniert nur dann einwandfrei wenn du den Namen schon kennst. Suchst du zum Beispiel nach Berli bekommst du auch nur Berli ausgegeben. Die Folge ist technisch ein teurer Echo-Server.

    Schau dir mal die alternateNames an. Darin sind wenn ich das richtig sehe die Namen mit Country-Code und ID einzeln zu finden.

    Irgendwie schon.
     
    Zuletzt bearbeitet: 2 April 2014
    Walter gefällt das.
  12. datenbeisser

    datenbeisser Aktiver Benutzer

    Das obengenannte Beispiel war für meine Frage auf das nötigste reduziert. Ist der gesuchte Ort gefunden, werden damit auch seine gegrafischen Daten, Zeitzone etc. ausgelesen.

    Die Abfrage mit SELECT substr(Data.OrtMulti, instr( Data.OrtMulti, 'Neu-Delhi')... ist wirklich ziemlich langsam. Ich werde mein C++ Programm wohl so schreiben, daß bei jeder dieser Abfragen, zur Eingabe eines neuen Recordsets aufgefordert wird, der dann die deutsche Ortsbezeichnung in eine eigene Tabelle schreibt. So wird sich das Problem auf kurz oder lang erledigen.
     
  13. Hony%

    Hony% Datenbank-Guru

    Oder du nimmst die oben bereits angesprochene alternateNames.zip. Alle Namen ordentlich normalisiert in einer neuen Tabelle.

    Ein kleiner Join in die Abfrage und das Thema ist erledigt.
     
    datenbeisser gefällt das.
  14. datenbeisser

    datenbeisser Aktiver Benutzer

    @Hony%

    Da hatte ich mal wieder ein Brett vorm Kopf und wußte deshalb zuerst mit dem Begriff "alternateNames" nichts anzufangen.

    WOW das IST wirklich die Lösung! Als Datenbank Neuling fällt es mir immer noch schwer zu erkennen, aus welchen Einzelteilen eine Datenbank zusammengesetzt wird.

    Tausend Dank, damit hast mir jetzt aber wirklich sehr geholfen! :)
     
    Zuletzt bearbeitet: 3 April 2014
    Hony% gefällt das.
  15. datenbeisser

    datenbeisser Aktiver Benutzer

    Ist es möglich zwei SQL-Abfragen zu einer Abfrage zu vereinen?
    Die Datenbank ist nun normalisiert, aber ich komme nur mit zwei SQL-Abfragen zum Ziel. Hier das Minimalbeispiel:

    Tabelle "Data"
    ID.......Ort.....................Laenge................ID_Land
    25.......Vienna...............16.2235..............AT
    48.......Vienna...............-88.3625............US
    53.......Wienau.............18.3762...............AT

    Tabelle "Multi"
    ID......OrtM..................ID_Sprache
    25......Wien...................de
    25......Vieno..................eo

    Gewünschtes Ergebnis:
    Gesucht werden alle Orte in "Österreich" die mit "Wien" beginnen in aphabetischer Reihenfolge:
    Ort..............Laenge................ID_Land
    Wien...........16.2235..............AT
    Wienau.......18.3762..............AT

    Die beiden zielführenden SQL-Abfragen:

    SELECT Data.Ort,
    Data.Laenge,
    Data.ID_Land
    FROM Data
    WHERE Data.Ort LIKE 'Wien%' AND Data.ID_LAND == 'AT'
    ORDER BY Data.Ort

    Ergebnis:
    Wienau......18.3762........AT

    SELECT Multi.OrtM,
    Data.Laenge,
    Data.ID_Land
    FROM Multi
    INNER JOIN Data ON Multi.ID = Data.ID
    WHERE Multi.OrtM LIKE 'Wien%' AND Data.ID_LAND == 'AT' AND Multi.ID_Sprache == 'de'
    ORDER BY Multi.OrtM

    Ergebnis:
    Wien...........16.2235.......AT

    Ist es möglich diese beiden Abfragen in einer Abfrage zu vereinen und dann die Ergebnisliste alphabetisch zu sortieren?
     
    Zuletzt bearbeitet: 3 April 2014
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden