Ich weiß auch nicht, ab wann der Optimizer seine Verfahren geändert hat (ich meine aber erst ab V6R1), dass Berechnungen der Select-Felder vor der Where-Klausel durchgeführt werden.
Mir ist es nämlich passiert, dass SQL's von V5 nach V6 nicht mehr funktionierten.
Per Where-Klausel hatte ich fehlerhafte Daten ausgefiltert um dann die korrekten Daten per CAST o.ä. anzupassen. Dies funktionierte nicht mehr, da der CAST häufig, aber nicht immer, vor dem Where ausgeführt wird.
Dies führt eben dazu, dass man verstärkt in seinen Berechnungen nun auch die Prüfungen der Where-Klausel wiederholen muss.
Aber auch hier ist die Reihenfolge der Ausführung eines Ausdruckes nicht gewährleistet, so dass es trotzdem zu Cast-Fehlern kommt obwohl man sie doch eigentlich per Case-Ausdruck ausgeschlossen hat. Hier hilft dann wirklich nur noch eine UDF.

Bei komplexen Ausdrücken hilft manchmal die NULL-Regel:
Ist ein Teilausdruck NULL wird der Gesamtausdruck NULL.

Beispiel:
coalesce(substr(MyFeld, 1, nullif(position('-' in MyFeld) - 1, -1)), MyFeld)