Select Abfrage als Teilstring
Hallo, ich möchte auf einen Suchbegriff innerhalb eines Textfeldes suchen.
Select [Tabelle] where [Feld] like [Suchbegriff]
liefert aber nur dann ein Ergebnis, wenn der Suchbegriff am Anfang des Feldes steht.
Gibt es eine Möglichkeit ein Ergebnis zu erhalten, wenn der Suchbegriff irgendwo auch in der Mitte des Feldes steht ?
17 Antworten
-
Mit contains() kann ein Textwert darauf geprüft werden, ob er eine bestimmte Zeichenfolge in beliebiger Länge enthält. Der Rückgabewert ist entweder true (gefunden) oder false (nicht gefunden). Damit lassen sich bspw. Textfelder nach Stichworten durchsuchen oder in Verbindung mit text() auch ermitteln, ob eine bestimmte Option eines Mehrfachauswahlfeldes aktiviert wurde. Zur Treffer-Ermittlung ist eine exakte Übereinstimmung erforderlich. Soll dabei nicht zwischen Klein- und Großbuchstaben unterschieden werden, können Text und/oder Suchstring mit lower() bzw. upper() in dieselbe Schreibweise gebracht werden. Wenn über die reine Prüfung des Vorkommens hinaus auch die Position des gesuchten Strings im Text benötigt wird, empfiehlt sich als Alternative die Funktion index().
Beispiel:
let SuchString := lower(SUCHBEGRIFF)
select TABELLE where contains(lower(DATENFELD)) = SuchString
-
super - die contains() Funktion kenne ich gut und verwende sie oft - aber letztesmal hat die bei einer select-Abfrage nicht funktioniert.... .seltsam - jetzt geht's ;-) Vielen Dank jedenfalls
-
Ich brauche einmal wieder Hilfe
was ist denn hier falsch????
let xBuch := upper(Search);
select BOOKS where contains(upper(BookName)) = xBuchFehlermeldung: Die Funktion ist nicht definiert: contains(String) in Zeile2, Spalte46
Ohne contains funktioniert es allerdings nicht selektiv.
Danke Wolfgang
-
Hallo Wolfgang,
---
let xBuch := upper(Search);
select BOOKS where contains(upper(BookName), xBuch)---
Leo
-
Danke Leo, dann ist das Beispiel oben nicht korrekt!!!???
-
Noch schneller funktioniert das ganze mit:
---
let xBuch := Search;
select BOOKS where BookName like xBuch---
allerdings wird die Suche nur ab Wortanfang duchgeführt also bei Lorem Ipsum wird ipsum gefunden aber sum-nicht.
Von daher ist die contains eine langsammere aber effektivere Methode.
Leo
-
Ja, scheint so. Contains braucht immer zwei argumente - zu durchsuchenden Text und eigentlichen Suchtext.
-
Da muss ich mich korrigieren. Habe gerade festgestellt dass like auch in Wordmitte sucht. Da wurde bestimmt etwas geändert.
Also meine Formel wäre dann definitiv:
let xBuch := Search;
select BOOKS where BookName like xBuchLeo
-
Leo zu diesem Thema:
----
let xBook := upper('Buch Name');
if xBook = "" then
select BOOKS
else
select BOOKS where upper(BookName) like xBook
end-----
wenn das Suchfeld leer ist werden alle 340 Datensätze angezeigt, wenn ein Begriff eingegeben wird zeigt er die Datensätze an.Bei mir wirft er bei like keine Datensätze aus, in denen das Wort zum Bsp. In der Mitte steht.
Wenn ich jetzt die obige Formel anpasse:
----
let xBook := upper('Buch Name');
if xBook = "" then
select BOOKS
else
select BOOKS where contains(upper(BookName),xBook)
end----
funktioniert die partielle Suche, aber er zeigt mir wenn das Feld leer ist nicht mehr die 340 Datensätze an.
Wolfgang
-
Ich weiß nicht was ich vorher getan habe, jetzt funktioniert like nicht mehr. Also:
---
if 'Buch Name' then
let xBook := upper('Buch Name');
select BOOKS where contains(upper(BookName), xBook)
else
select BOOKS
end
---
Leo
-
Ok, jetzt weiß ich,was passiert ist:
ich habe zum Testen den Suchtext direkt in die Formel rein geschrieben:
---
select BOOKS where 'BookName' like "XYZ"
---
so funktioniert die Suche auch in der Wortmitte. Ersetzt ich den Text durch eine Variable - läuft die Suche nur ab Wortanfang. Bug?
Leo
-
Funktioniert auch wenn das für mich schwerer nachzuvollziehen ist. Dennoch Danke
Wolfgang
-
Ja, das Gleichheitszeichen in meinem Beispiel des zweiten Kommentars ist natütlich falsch. Es hätte heißen müssen:
let SuchString := lower(SUCHBEGRIFF)
select TABELLE where contains(lower(DATENFELD), SuchString)
Sorry für die Verwirrung.
-
if 'Buch Name' then
let xBook := upper('Buch Name');
select BOOKS where contains(upper(BookName), xBook)
else
select BOOKS
endDieses Script von Leo ist perfekt, wenn Mann es direkt in der Anischt eingibt. An dieser Stelle nochmals Danke.
Wenn ich das Script statt in der Ansicht in einer Befehlschaltfläche eingebe, was muss ich ergänzen, damit dann die Datensätze in der Ansicht angezeigt werden??
Wolfgang
-
Und gleich noch eine Frage wie muss ich das Script erweitern, wenn ich noch in einer anderen Tabelle mit dem gleichen Suchbegriff suchen möchte.
select VIDEOS where contains(upper(VideoName),xBook)
Wolfgang
-
Hallo Wolfgang,
Das Ansichtelement kansst du nur über seine eigene Eigenschaftsfelder steuern. Damit die Änderungen an der Ansicht wirksam sind musst du aus dem Feld 'Buch Name' raus gehen. Wenn du also einen Button ohne Funktion einbaust, wird es so aussehen als würde sich die Ansicht nach dem Klick auf den Button ändern. Die Formel für Videos sollte so auch funktionieren.
Du kannst auch ein Auswahlfeld einbauen und dort zwei Einträge machen:
1. Suche in Books
2. Suche in Videos
Dieses Feld dann als switch darstellen lassen und der Beschriftungsposition auf "Versteckt" schalten. Dann kannst du für die Ansicht die Formel schreiben:
---
if 'Buch Name' then
let xBook := upper('Buch Name');
if Auswahl = 1 then
select BOOKS where contains(upper(BookName), xBook)
else
select VIDEOS where contains(upper(VideoName), xBook)
end
else
select BOOKS
end
---
Leo
-
Thanks Leo funktioniert
Wolfgang
Content aside
- vor 5 JahrenZuletzt aktiv
- 17Antworten
- 5126Ansichten