Seite 1 von 1

[gelöst] 3-Felder-Suche in einer Abfrage nicht korrekt?

Verfasst: So 9. Okt 2022, 18:35
von Pit Zyclade
Hallo Robert, (h :shock: allo andere Experten?)
Zurückkommend auf Deinen Vorschlag mit einer zusätzlichen Tabelle "Filter", kam mir nach erfolgreicher Suche nach 2 Feldern die Idee, noch mal dieses auf Suche nach 3 Feldern zu steigern. Die Filter-Tabelle zu erweitern, ist ja kein Problem, auch die SQL-Formulierung in der Abfrage war schnell ohne Protest verwirklicht:

SELECT "xxx"."*" FROM "xxx WHERE
( ( LOWER ( "Motiv" ) LIKE '%' || COALESCE ( ( SELECT LOWER ( "SucheMotiv" ) FROM "Filter" WHERE "Filter"."ID" = TRUE ), '' ) || '%' ) OR "Motiv" IS NULL )
AND
( ( LOWER ( "Material" ) LIKE '%' || COALESCE ( ( SELECT LOWER ( "SucheMaterial" ) FROM "Filter" WHERE "Filter"."ID" = TRUE ), '' ) || '%' ) )
AND
( ( LOWER ( "Serie" ) LIKE '%' || COALESCE ( ( SELECT LOWER ( "SucheSerie" ) FROM "Filter" WHERE "Filter"."ID" = TRUE ), '' ) || '%' ) )
ORDER BY "Motiv" ASC, "Serie" ASC

Aber kurioserweise geht die Suche nach 2 Filtereingaben ("SucheMotiv"=Hans , "SucheSerie"=Lieblingsmächen, "SucheMaterial"= (leer) nur scheinbar korrekt, obwohl ich im dritten Filterfeld nichts drin habe! Nach meinem Verständnis hätte ich aber dort etwas eingeben müssen, denn bei den 3 gefundene Datensätzen war das Feld "Material" in keinem Fall leer.

Folglich ist die SQL-Formulierung bezüglich Inhalt (nicht bezüglich der SQL-Form) falsch bzw. unzutreffend.
Mein Wunsch war, dass nur die Datensätze angezeigt werden, bei denen alle drei Suchfelder-Inhalte zutreffend sind.

Danke für Diskussion!

Pit

Gibt es vielleicht irgendeine SQL-Satz-Längenbeschränkung? Oder ist doch ein logischer Fehler in meiner "Suche"?

Re: 3-Felder-Suche in einer Abfrage nicht korrekt?

Verfasst: So 9. Okt 2022, 19:11
von RobertG
Die Suche, so wie Du sie anlegst, gilt bei leeren Eingaben für alle Felder:

Code: Alles auswählen

 LOWER ( "Serie" ) LIKE '%' || COALESCE ( ( SELECT LOWER ( "SucheSerie" ) FROM "Filter" WHERE "Filter"."ID" = TRUE ), '' ) || '%' 
heiß doch: Suche in "Serie" alles, was irgendwo den Begriff stehen hat, den ich in "SucheSerie" eingegeben hat. Ist "SucheSerie" leer, dann nimm einfach stattdessen einen leeren Text.

Code: Alles auswählen

COALESCE ((…), '' )
Sagt: Wenn der Inhalt in den Klammern NULL ist, dann Text ohne jegliche Ausdehnung - nicht NULL. Damit wird

Code: Alles auswählen

 LOWER ( "Serie" ) LIKE '%' || ''  || '%' 
also jeder beliebige Text abgefragt.

Das ist bei mir in dem Moment gewollt, weil ich so durch Auslassen des Suchbegriffs den gesamten Inhalt angezeigt bekomme. Mit dem Suchbegriff schränke ich den Inhalt ein. Wenn Du das nicht möchtest, dann musst Du COALESCE da raus nehmen. Dann kommt anschließend eben bei leeren Suchbegriffen

Code: Alles auswählen

LOWER ( "Serie" ) LIKE NULL
und das Ergebnis bleibt leer.

Re: 3-Felder-Suche in einer Abfrage nicht korrekt?

Verfasst: So 9. Okt 2022, 19:13
von Wanderer
Was mir auffällt: Nur beim ersten Feld Mitiv hast Du die zusätzliche Abfrage auf NULL mit drin:

Code: Alles auswählen

OR "Motiv" IS NULL
Damit wird nach allen Datensätzen gesucht, die Deinen genannten Bedingungen entsprechen und bei denen etwas beliebiges in Material steht. (Und anscheinend gibt es da 3 Datensätze). Datensätze ohne Materialangabe fallen raus, dafür bräuchtest Du

Code: Alles auswählen

OR "Material" IS NULL
PS: Robert war schneller beim tippen :-)

Re: 3-Felder-Suche in einer Abfrage nicht korrekt?

Verfasst: Mo 10. Okt 2022, 15:07
von Pit Zyclade
Hallo Wanderer,
Wanderer hat geschrieben:
So 9. Okt 2022, 19:13
Was mir auffällt: Nur beim ersten Feld Mitiv hast Du die zusätzliche Abfrage auf NULL mit drin:

Code: Alles auswählen

OR "Motiv" IS NULL
Damit wird nach allen Datensätzen gesucht, die Deinen genannten Bedingungen entsprechen und bei denen etwas beliebiges in Material steht. (Und anscheinend gibt es da 3 Datensätze). Datensätze ohne Materialangabe fallen raus, dafür bräuchtest Du

Code: Alles auswählen

OR "Material" IS NULL
Leider NEIN! Das ist doch das Komische daran, dass gerade bei den drei resultierenden Datensätze, auf die Motiv und Serie zutreffen, steht unter Material "Ag" drin, sind also nicht leer und hätten nicht erscheinen dürfen!

Aber ich habe mal folgendes experimentell probiert und jeweils nach Sichern auch die DB geschlossen und neu aufgerufen:
1. Beim Motiv mal diese"Motiv" IS NULL rausgenommen. Das bewirkt gar keine Änderung im Resultat.
2. Wieder "Motiv" IS NULL reingenommen und jetzt man "Material" IS NULL entsprechen eingefügt. Aber auch hierbei ändert sich gar nichts!!!

Man muß noch wissen, in dieser Datenbank sind insgesamt nur 4 Datensätze ohne Inhalt unter Material. Aber diese wurden gar nicht in meiner Suche-Konstruktion angesprochen oder im Resultat gelistet.

Also muß mein Fehler irgendwoanders sein.

Re: 3-Felder-Suche in einer Abfrage nicht korrekt?

Verfasst: Mo 10. Okt 2022, 15:27
von Pit Zyclade
Hallo Robert,

Diesmal konnte ich deinen obigen Darlegungen nicht folgen. Irgendwie rauschen die Sachen unübersichtlich vorbei.

Machen wir es mal anders herum, ich versuche mal meine Wünsche zu präzisieren:
1. Möglicht in ähnlicher Konstruktion wie bisher, weil ich sowohl Erfolg haben will, aber auch aus Vorhandenem was lernen möchte.
2. Wenn ich gar keinen Inhalt in den drei Felder der Filterdatei habe, möchte ich alle Datensätze erhalten.
3. Wenn ich ein (oder alle drei) Felder in der Filterdatei bestücke, möchte ich egal ob groß oder klein geschrieben, die zutreffenden Datensätze im Resultat haben.
4. Sollte ich in den Felder der Filterdatei eine Leerstelle eingegeben haben, dann dürften Datensätze herauskommen, bei denen in der Tat eine Leerstelle, z.B. zwischen Zeichen der betreffenden Felder vorkommen. (So war das doch bei meiner zu Recht unzutreffenden Reklamationsbeispiel "Lieblingsmärchen", als mit und ohne Leerstelle ganz korrekt alles war, nur ich hatte die Datenbank im Zwischenschritt nicht geschlossen.)

Also was konkret muss ich anders machen, damit alle drei Suchbegriffe so arbeiten (wie bei nur zweien, wo es korrekt geht)?
SQL hat sich nicht beschwehrt, was aber nur bedeutet, dass ich nicht gegen Regeln verstoßen habe. Aber irgendetwas habe ich falsch formuliert. Vielleicht andere oder mehr Klammern oder mehr getrennte Bereiche oder andere Verbindungswörter als "AND" ?

Re: 3-Felder-Suche in einer Abfrage nicht korrekt?

Verfasst: Mo 10. Okt 2022, 17:16
von RobertG
Du wolltest in Deinem Ursprungspost durch eine leere Eingabe
"SucheMaterial"= (leer)
erzeugen, dass Du nur Inhalte siehst, bei denen das Feld leer ist - also in der Regel NULL.

Wenn Du dies erreichen willst, dann darfst Du nicht mit COALESCE arbeiten. Dann erhältst Du bei der Auswahl von leeren Eingaben auch leere Felder (NULL). Und wenn alle 3 Felder leer sind, dann siehst Du nur noch eine Zeile zur Neueingabe von Daten. Du wirst aber nicht, wie eigentlich geplant, eine Möglichkeit haben, tatsächlich alle Datensätze zu Gesicht zu bekommen. Das geht dann ja nicht mehr über fehlenden Eingaben in der LIKE-Bedingung.
2. Wenn ich gar keinen Inhalt in den drei Felder der Filterdatei habe, möchte ich alle Datensätze erhalten.
Das schließt sich dann aus. Entweder Du kannst nach leeren Feldern suchen oder Du kannst bei leeren Feldern alle Daten sehen.

Re: 3-Felder-Suche in einer Abfrage nicht korrekt?

Verfasst: Di 11. Okt 2022, 16:19
von Pit Zyclade
Ich hatte Mühe, das Ganze zu begreifen. Aber kurioserweise geht jetzt alles so, wie ich es wollte.
Ich habe jetzt die Suche für alle drei Ziele gleich gestaltet.
SELECT "xxx"."*" FROM "xxx"
WHERE
( ( ( LOWER ( "Motiv" ) LIKE '%' || COALESCE ( ( SELECT LOWER ( "SucheMotiv" ) FROM "Filter" WHERE "Filter"."ID" = TRUE ), '' ) || '%' ) OR "Motiv" IS NULL ) )
AND
( ( ( LOWER ( "Material" ) LIKE '%' || COALESCE ( ( SELECT LOWER ( "SucheMaterial" ) FROM "Filter" WHERE "Filter"."ID" = TRUE ), '' ) || '%' ) OR "Material" IS NULL ) )
AND
( ( ( LOWER ( "Serie" ) LIKE '%' || COALESCE ( ( SELECT LOWER ( "SucheSerie" ) FROM "Filter" WHERE "Filter"."ID" = TRUE ), '' ) || '%' ) OR "Serie" IS NULL ) )
ORDER BY "Serie" ASC, "Motiv" ASC

Warum es jetzt geht und vorher nicht, bin ich nicht sicher dahintergekommen.
Möglicherweise habe ich beim Experimentieren, als ich die Inhalte der Felder in der Filtertabelle verändert habe, bei dem sehr empfindlichen Notebook irgendetwas mehrfach modifiziert. Das ist mir heute z.B. mit dem Haken von "true" im ID-Feld passiert, ohne dass ich es wollte. Ja, man muß sich immer wieder konzentrieren und langsam und sicher arbeiten, nicht husch-husch.

Vielen Dank für die vielen Anregungen,
von Pit

Re: [gelöst] 3-Felder-Suche in einer Abfrage nicht korrekt?

Verfasst: Do 13. Okt 2022, 08:10
von Wanderer
Auch eine gern gesehene Fehlerquelle: Leerzeichen im "leeren" Feld der Filtertabelle.

Ich habe meinen Kollegen deshalb einen Macro-Button "Alle Daten" erzeugt, der einfach die Filtertabelle löscht (jeweils NULL einträgt)

Hauptsache es funktioniert jetzt.

J.