[gelöst] SQL - Positionsabfrage von rechts?

    • Offizieller Beitrag

    Hi,
    in AutoIt lässt sich bei StringInStr() mit -1 im Parameter für Vorkommen von rechts suchen.

    Ich suche für Firebird-SQL eine solche Variante.
    Wir haben leider Adressangaben mit: Vorname Zuname in einem Datenfeld. Manchmal benötige ich aber beides getrennt. Momentan nutze ich folgendes Query:

    SQL
    select 
     substrex( name1, pos(" ",name1)+1, 256 ) NAME,
     substrex( name1, 1, pos(" ",name1)-1 ) VORNAME
    from 
     kunden 
    where 
     kundennr = 10000

    Interne Funktionen:
    substrex ( sString, iStartPos, iCount ) gibt iCount Zeichen ab iStartPos zurück
    pos ( sSearch, sString) gibt Integer Position von sSearch zurück

    Ich kann somit nur das erste Leerzeichen verwerten. Für viele Namen ist das ausreichend, aber wenn z.B. Doppelvornamen ohne Bindestrich existieren oder auch ein Titel, dann gehts in die Hose. Eine bessere Treffergröße hätte ich bei Abfrage des letzten Leerzeichens.
    Gibt es evtl. Workarounds, die das StringInStr simulieren können?
    Ich hatte schon überlegt (mangels Möglichkeit von Schleifen) eine gestaffelte Abfrage zu erstellen, die die Leerzeichenposition des letzten Querys als Start im nächsten nimmt. Mehr als 5 Leerzeichen sind nicht zu erwarten, also wäre das auch nicht zu verschachtelt - aber wie kann ich anweisen, dass bei Positionsergebnis 0 auf das Ergebnis des vorigen Schrittes zugegriffen werden soll?

    Bin für jede Idee dankbar.

    EDIT: Als Hinweis - ich verwende Firebird Version 1.5, die Funktion IIF (funktioniert wie ein Ternärer Operator) gibt es erst ab Version 2.0

    • Offizieller Beitrag

    Der Verweis auf Case war gut.
    Habe mir jetzt eine zweistufige dreistufige Lösung erstellt (also von 2 3 möglichen Leerzeichen wird beim letzten getrennt. Damit sollten 99% der Fälle abgedeckt sein (solange wir nicht als Kundin Pippilotta Viktualia Rollgardina Pfefferminz Efraimstochter Langstrumpf bekommen :rofl: ).

  • Noch ein anderer Vorschlag.

    Diese Funktionen können zu Firebird konvertiert werden, musst dafür nur die entsprechenden "Synonyme" aufrufen :)

    SQL
    SELECT
        SUBSTRING_INDEX(name1, " ", -1) as NACHNAME,
        REVERSE(SUBSTRING(REVERSE(name1), INSTR(REVERSE(name1), " "))) as VORNAME
    FROM
        Kunden
    WHERE 1

    Einmal editiert, zuletzt von Texos (10. Dezember 2020 um 20:03)