[NEWSboard IBMi Forum]

Thema: SQL CONCAT

  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    SQL CONCAT

    Hallo,

    ich habe eine Kalenderdatei wo ich die Felder(alle 2, 0 Dezimal):
    • Jahrhundert,
    • Jahr,
    • MONAT und
    • TAG

    in einem Sqlstatement zu einem 8, 0 Feld zusammenführen möchte.

    Leider unterdrückt mir das Sqlstatement die Führenden Nullen.

    Code:
    SELECT KJH concat KJJ concat KMM concat KTT FROM  PKALEND
    Wie müsste das Sql-Statement aussehen?

    Dank im Voraus

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Digits(xx) liefert auch die Vornullen.
    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

  3. #3
    Registriert seit
    Apr 2012
    Beiträge
    360
    Code:
    SELECT CAST (DIGITS(KJH)                  
          CONCAT DIGITS(KJJ)                  
          CONCAT DIGITS(KMM)                  
          CONCAT DIGITS(KTT)                  
          AS DECIMAL( 8, 0 )) AS DATUMAB      
    FROM PKALEND                              
    WHERE DATUMAB >= 20140101
    Danke für den Tip mit dem Digits.

    Ich habe mir den Ausdruck als Datumab definiert.
    Wieso akzeptiert er mir in der WhereClausel das Datumab nicht?

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Weil du nicht auf das Ergebnis vergleichen kannst, in deinem Fall ist der Ausdruck zu wiederholen.
    Alternativ kannst du auch eine CTE verwenden, dann ist der neue Name des Ausdrucks auch bekannt.

    Bedenke, dass solche Abfragen grundsätzlich einen Tablescan durchführen und nicht performant sind!
    Ich empfehle dir eine Hilfsdatei mit den Einzelfeldern sowie dem Gesamtfeld und Indizes.
    Dann kannst du per Inner Join ohne rechnen schneller abfragen.
    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

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Ausdrücke umbenannte Namen, neue Namen dürfen können im gleichen Sub-Select nicht verwendet werden.
    Ein Sub-Select besteht bez. kann bestehen aus:
    SELECT ....
    FROM
    WHERE
    GROUP
    HAVING

    Mehere Sub-Selects können über UNION, EXCEPT oder INTERSECT zusammengemischt werden.
    ORDER BY geht über alle verbundenen Sub-Selects, d.h. sortiert das Ergebnis und ist deshalb außerhalb des Sub-Selects.
    In einem Order By können damit auch die neuen Name oder Umbenennungen verwendet werden.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #6
    Registriert seit
    Nov 2007
    Beiträge
    371
    verwende halt einfach WITH wenn es dir nur darum geht die Abfrage ausführen zu können

    with name as (
    SELECT CAST (DIGITS(KJH)
    CONCAT DIGITS(KJJ)
    CONCAT DIGITS(KMM)
    CONCAT DIGITS(KTT)
    AS DECIMAL( 8, 0 )) AS DATUMAB
    FROM PKALEND )

    select * from name
    WHERE DATUMAB >= 20140101

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Wie gesagt, bei kleinen Dateien kann man so was machen, es funktioniert ja schließlich.
    Bei mehr als 100.000 Sätzen geht dann die Performanceschreierei wieder los.
    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

  8. #8
    Registriert seit
    Nov 2007
    Beiträge
    371
    man muss nur schauen das der dieter nicht im haus ist . ansonsten rauchts

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von woodstock99 Beitrag anzeigen
    man muss nur schauen das der dieter nicht im haus ist . ansonsten rauchts
    ... wenn etliche Tabellen mit mehreren 100 Millionen records in einer table und Millionen von komplexen Transaktionen Bundesliga sind, dann sind ein paar 100.000 Sätze Kreisklasse. In dem Sinne trauere ich schon der Praktiker Pleite ein wenig hinterher, die hatten nämlich eine der größten AS400 Installationen, die ich kenne.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Aber auch in der Kreisklasse wird schon nach Performance gerufen.
    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

  11. #11
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... dass Du Bundesliga tauglich bist, haben wir ja schon ausprobiert, beim Fußball soll es allerdings Leute geben, die das Runde nicht vom Eckigen unterscheiden können, aber genau wissen wie man gegen Ghana gewonnen hätte.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  12. #12
    Registriert seit
    Oct 2015
    Beiträge
    1
    Ich hatte mir für solche Fälle eine Funktion gebaut, die alles umformatiert. Die könnte man an seine Bedürfnisse anpassen:

    CREATE FUNCTION TOOLS.REFORMAT(PREIS DECIMAL(7, 2))
    RETURNS VARCHAR (16)
    DISALLOW PARALLEL LL:
    BEGIN
    DECLARE Z1 VARCHAR (16);
    IF SUBSTR(CAST(PREIS AS VARCHAR (16)), 1,1) = '.' THEN SET Z1 = CONCAT ('0', CAST (CAST (PREIS AS DECIMAL(7,2)) AS VARCHAR(16)));
    ELSE SET Z1 = CAST(PREIS AS VARCHAR(16));
    END IF;
    SET Z1 = TRIM(REPLACE(Z1, '.', ','));
    RETURN (Z1);
    END LL;

Berechtigungen

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