Wie nach substrings suchen?

datenbeisser

Aktiver Benutzer
Beiträge
38
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
 
Werbung:
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:
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!
 
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!
 
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?

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.
 
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.
 
Als Anfänger kann ich leider das Design nicht beurteilen.

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.

Ähm, ich muß hier mal fragen: ist das nicht ein komplett kapottes Design?
Irgendwie schon.
 
Zuletzt bearbeitet:
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.
 
@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:
Werbung:
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:
Zurück
Oben