0

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

null
    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Dirk_Pulver_2020
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Wolfgang
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich brauche einmal wieder Hilfe

    was ist denn hier falsch????

    let xBuch := upper(Search);
    select BOOKS where contains(upper(BookName)) = xBuch

     

    Fehlermeldung: Die Funktion ist nicht definiert: contains(String) in Zeile2, Spalte46

    Ohne contains funktioniert es allerdings nicht selektiv.

    Danke Wolfgang

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Wolfgang,

    ---

    let xBuch := upper(Search);
    select BOOKS where contains(upper(BookName), xBuch)

    ---

    Leo

    • Wolfgang
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Danke Leo, dann ist das Beispiel oben nicht korrekt!!!???

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ja, scheint so. Contains braucht immer zwei argumente - zu durchsuchenden Text und eigentlichen Suchtext.

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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 xBuch

    Leo

    • Wolfgang
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Wolfgang
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Funktioniert auch wenn das für mich schwerer nachzuvollziehen ist. Dennoch Danke

    Wolfgang

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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.

    • Wolfgang
    • vor 4 Jahren
    • Gemeldet - anzeigen

    if 'Buch Name' then
    let xBook := upper('Buch Name');
    select BOOKS where contains(upper(BookName), xBook)
    else
    select BOOKS
    end

    Dieses 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

    • Wolfgang
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Wolfgang
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Thanks Leo funktioniert

    Wolfgang

Content aside

  • vor 4 JahrenZuletzt aktiv
  • 17Antworten
  • 5035Ansichten