[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Simple IsNumeric:

    where
    len(trim(translate(field, ' ', '0123456789', ' ')) = 0

    Das Problem mit SQL ist aber z.T. dass durch Optimierungen Ausdrücke ausgewertet werden, die noch nicht auszuwerten sind, Beispiel:

    where
    len(trim(translate(field, ' ', '0123456789', ' ')) = 0
    and
    cast(trim(field) as integer) > 0

    Durch die And-Klausel wird die 2. Bedingung ggf. geprüft obwohl sie durch die 1. Bedingung bereits rausfällt, die Prüfung also eigentlich nicht mehr nötig ist.
    Dies liegt aber am Optimizer begründet, der SQL's "umbaut" und dann solche Konstrukte auf die Nase fliegen.
    Dies gilt auch für Felder in der Select-Liste.

    Leider funktioniert das auch nicht mit Subselect, CTE oder auch einer View.
    Ich hatte sowas bis V5R4 am laufen, nach der Umstellung auf V6R1 klappte der SQL genau deswegen nicht mehr und wir mussten den Teil neu schreiben.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  2. #2
    Registriert seit
    Aug 2012
    Beiträge
    5
    Hallo nochmal und vielen Dank für die weiteren Vorschläge. Ich habe es nun offenbar mit einer TRANSLATE-Variante hinbekommen. Die Inspiration dazu habe ich hier gefunden: check for numeric in db2 sql - dBforums

    Allerdings wollte mir die Einschränkung auf numerische Werte mit geeigneter WHERE-Bedingung ja schon anfangs nicht zum Erfolg helfen, daher habe ich es wie in Brigittas Vorschlag vorne beim SELECT untergebracht. So sieht die Lösung aktuell aus.

    Code:
    WITH
    
    numerischeBereiche AS (
    SELECT CASE WHEN translate(Wert_Min, ' ', '0123456789') = ' ' THEN cast(Wert_Min AS int) ELSE 0 END AS min FROM
    SqlTest.WP_Wertebereich
    WHERE Parameter_Id = 4 AND Wert_Max IS NOT NULL ) SELECT
    *
    FROM numerischeBereiche
    WHERE min <= 15;


    Näher werde ich mir die Sache erst am Montag wieder ansehen, aber so scheint es nun zu funktionieren.

    Nochmals Danke und ein schönes Wochenende
    Matthias

  3. #3
    Registriert seit
    Jul 2011
    Beiträge
    14
    Wert_Min darf dann allerdings nie blank sein sonst stimmt translate(Wert_Min, ' ', '0123456789') = ' ' trotzdem

  4. #4
    Registriert seit
    Aug 2012
    Beiträge
    5
    Das war doch nur ein relevanter Auszug der Lösung ;-)

    Insgesamt sieht es nun so aus und scheint wunderbar zu funktionieren (sorry, der Editor hier zerhaut die Formatierung immer total, bekomme es nicht übersichtlicher):

    Code:
    ExecSQL
    WITH numerischeBereiche AS(
    SELECT CASE WHEN translate(Wert_Min,' ','0123456789')=' ' AND
    translate(Wert_Max,' ','0123456789')=' ' AND
    Wert_Min !=' ' AND Wert_Max !=' '
    THEN cast(Wert_Min AS int)
    ELSE 0
    END AS min,
    CASE WHEN translate(Wert_Min,' ','0123456789')=' ' AND
    translate(Wert_Max,' ','0123456789')=' ' AND
    Wert_Min !=' ' AND Wert_Max !=' '
    THEN cast(Wert_Max AS int)
    ELSE 0
    END AS max
    FROM WP_Wertebereich
    WHERE Parameter_Id = :paramID AND Wert_Max IS NOT NULL
    )
    SELECT count(min)
    INTO :resultCount
    FROM numerischeBereiche
    WHERE max > min AND min <= :paramWert AND max >= :paramWert;
    
    Dazu hätte ich noch eine kleine Frage: gibt es eine Möglichkeit, die beiden CASE im SELECT zusammenzufassen? Ich habe keine Möglichkeit gefunden, beim THEN mehrere Spalten zu selektieren. Oder muss ich das Konstrukt wohl oder übel doppelt mitschleppen?

    Viele Grüße
    Matthias

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Du kannst es dir schon einfacher machen, da der Case mehrere Zweige erlaubt.
    Allerdings ist natürlich je Spalte ein Ausdruck zu definieren.

    case
    when wert_min = ' ' then NULL
    when translate(....) <> ' ' then NULL
    else cast(...)
    end as min
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  2. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  3. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  4. SQL: String in 2 Felder aufteilen
    By Wanderer_HB in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-09-05, 10:19
  5. SQL :mehrere felder in einen string
    By Robi in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 24-03-05, 14:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •