Funktion LOCATE in Base

Hallo zusammen,

ich möchte in Base (LO 4.2.8.2) zwei Felder aus zwei verschiedenen
Tabellen vergleichen und herausfinden, ob der Inhalt des einen Feldes im
anderen enthalten ist. Beide Felder haben den Typ "Text".

Dazu benutze ich in einer Abfrage die Funktion LOCATE(). Erste Frage:
Gibt es eine sinnvollere Alternative?

Ich habe die odb-Datei hier hochgeladen:
https://www.wuala.com/ansgar.machalicky/Dokumente/LO-users/?key=jPG59LuMz6yP

Bei einem Test zwischen zwei Tabellen ("Mitglieder" und "Kinder")
funktioniert das ganz wunderbar, das Ergebnis ist 1 für die Fälle, in
denen der Text enthalten ist, und falls nicht, lautet es 0 (vgl. Abfrage
"LOCATE.Test02") Bei den eigentlichen Tabellen läuft's aber nicht: Es
wird für alle Fälle nur die 0 als Ergebnis ausgegeben, obwohl es
eindeutig einige Treffer gibt (LOCATE.Test04).

Woran könnte es liegen (das ist die zweite Frage..... )? Ich finde den
Fehler nicht. Müssen die Tabellen dazu in einer Relation zueinander stehen?
Ich hatte schon die Vermutung, dass die leeren Felder in der Spalte
Probleme machen könnten und habe sie deshalb mit dem Text "leer"
aufgefüllt, aber auch das bringt keine Besserung.

Dankbar für jeden Tipp,
Ansgar

Hallo Ansgar,

Hallo zusammen,

ich möchte in Base (LO 4.2.8.2) zwei Felder aus zwei verschiedenen
Tabellen vergleichen und herausfinden, ob der Inhalt des einen Feldes im
anderen enthalten ist. Beide Felder haben den Typ "Text".

Dazu benutze ich in einer Abfrage die Funktion LOCATE(). Erste Frage:
Gibt es eine sinnvollere Alternative?

Ich habe die odb-Datei hier hochgeladen:
https://www.wuala.com/ansgar.machalicky/Dokumente/LO-users/?key=jPG59LuMz6yP

Bei einem Test zwischen zwei Tabellen ("Mitglieder" und "Kinder")
funktioniert das ganz wunderbar, das Ergebnis ist 1 für die Fälle, in
denen der Text enthalten ist, und falls nicht, lautet es 0 (vgl. Abfrage
"LOCATE.Test02") Bei den eigentlichen Tabellen läuft's aber nicht: Es
wird für alle Fälle nur die 0 als Ergebnis ausgegeben, obwohl es
eindeutig einige Treffer gibt (LOCATE.Test04).

Woran könnte es liegen (das ist die zweite Frage..... )? Ich finde den
Fehler nicht. Müssen die Tabellen dazu in einer Relation zueinander stehen?

Ich denke schon, wie soll Base sonst wissen,was mit wem verglichen
werden soll? Das ist so völlig undefiniert. Du willst doch wissen, ob
eines der Mitglieder oder eines der Kinder einen Umsatz hatte. Mit den
vorhandenen Tabellen sieht es aber schlecht aus. Sinnvoll ist es, beim
Erfassen des Umsatzes die ID des Mitgliedes mit einzutragen.

Wenn Du mal aus der letzten Spalte den Teil LCASE(
"Umsaetze"."Beguenstigter" ) als neue Spalte daneben stellst, wird
immer "ronan reynolds" angezeigt. Da sieht man, die drei Tabellen werden
hier irgendwie miteinander gemischt.

Ich hatte schon die Vermutung, dass die leeren Felder in der Spalte
Probleme machen könnten und habe sie deshalb mit dem Text "leer"
aufgefüllt, aber auch das bringt keine Besserung.

Dankbar für jeden Tipp,
Ansgar

Viele Grüße
Thomas

Hallo Ansgar,

Bei einem Test zwischen zwei Tabellen ("Mitglieder" und "Kinder")
funktioniert das ganz wunderbar, das Ergebnis ist 1 für die Fälle, in
denen der Text enthalten ist, und falls nicht, lautet es 0 (vgl. Abfrage
"LOCATE.Test02") Bei den eigentlichen Tabellen läuft's aber nicht: Es
wird für alle Fälle nur die 0 als Ergebnis ausgegeben, obwohl es
eindeutig einige Treffer gibt (LOCATE.Test04).

Versuche einmal in LOCATE.Test04 eine Abfrage, die auch eine Verbindung
der erforderlichen Tabellen ermöglicht, z.B.

SELECT "Mitglieder"."Vater.Vorname", "Mitglieder"."Vater.Nachname",
LOCATE( LCASE("Mitglieder"."Vater.Nachname"), LCASE(
"Umsaetze"."Beguenstigter" ) ) AS "Nachname in Umsaetze?",
"Umsaetze"."Beguenstigter" FROM "Mitglieder" LEFT JOIN "Umsaetze" ON
"Mitglieder"."Vater.Nachname" = "Umsaetze"."Beguenstigter"

Bei Dir stehen die Tabellen nebeneinander. Da kann aus der Tabelle
"Umsaetze"."Beguenstigter" kein eindeutiger Wert kommen.

Gruß

Robert

Hallo Ansgar,

laut der Dokumantation der HSQLDB (http://hsqldb.org/doc/guide/builtinfunctions-chapt.html#bfc_string_binary_functions) gibt LOCATE die Position bei der String 1 in String2 beginnt, es wird also kein Boolean zurückgegeben, ob er enthalten ist.

Eine Alternative wäre vielleicht IN:

SELECT name1 FROM t1 IN (SELECT name2 FROM t2 WHERE name = 'Name');

Wobei ich hier nur einen Namen beachtet habe.

Viele Grüße

Ralf