[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2017
    Beiträge
    12

    order by case when :a = 12 then a35#07 else feldB end, erzeugt Fehler

    Hallo,

    ich versuche in SQL nach einem Feld a35#07 zu sortieren. Dieses Feld ist als char(35) in der Tabelle definiert. Andere Aktionen damit laufen normal.
    Bei dem Versuch nach diesem Feld innerhalb eines CASE WHEN zu sortieren versucht RPG den Feldinhalt in decimal(7,0) umzuwandeln, was natürlich nicht geht.
    (Außerhalb eines CASE WHEN geht es).
    Ich wollte mir halt den Umweg über Prepare Statement sparen.

    Gibts dafür eine Lösung?
    (order by :var1, geht gar nicht)

    LG, Martin

    Joblog:
    CPD4019 SELECT/OMIT-Fehler in Feld Cast(Translate(STDDATIH_2.A35#07, *UNNAMED Table) AS Decimal(7,0)), Teildatei STDDATIH.
    SQL0802 Fehler bei Datenumsetzung oder beim Zuordnen von Daten.

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.490
    Setzt mal den Feld-Namen in Anführungszeichen, also "A35#07".
    Was passiert dann?

    Birgitta

  3. #3
    Registriert seit
    Sep 2017
    Beiträge
    12
    Das hilft leider nicht. Habe ich schon probiert.
    Auch das Verschachteln mit einem Subselect und umbenennen der Spalte hilft nicht.
    Auch 'a35'||chr(35)||'07' hilft nicht.
    Das # wird als Anweisung zum "Cast as decimal" verstanden, und da geht bisher kein Weg vorbei.

  4. #4
    Registriert seit
    Aug 2006
    Beiträge
    1.782
    Es geht doch nichts über EDI-Probleme ;-)

    Und wenn Du eine View darüber machst?

    GG 4474

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    17.537
    Ein Order By erlaubt meines Wissens nach keine Ausdrücke mehr sondern bezieht sich immer auf die Ergebnisfelder.
    Also, wenn man dynamische Sortierung benötigt, dann ein berechnetes Feld bilden und danach dann sortieren:

    select ..... Ausdruck as OrderByAusdruck
    from ....

    order by OrderByAusdruck
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: http://www.fuerchau.de/software/upload400.htm
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.490
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ein Order By erlaubt meines Wissens nach keine Ausdrücke mehr sondern bezieht sich immer auf die Ergebnisfelder.
    Da bist Du falsch informiert! Im OrderBy können sowohl die Ausdrücke als auch die neuen Spalten-Namen verwendet werden.
    In den WHERE-Bedinugnen, im Group by und im Having dürfen nur die Ausdrücke, nicht jedoch die neuen Spalten-Namen angegeben werden.
    Das war aber schon immer so, dass innerhalb des gleichen Sub-Selects die neuen Spalten-Namen nicht verwendet werden dürfen.
    Order By zählt nicht zum Sub-Select und deshalb können auch die neuen Spalten-Namen verwendet werden.

    Birgitta

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.490
    Ich habe gerade eine Datei generiert mit "exotischen" Feld-Namen und hatte keine Probleme.
    Die folgenden Statements konnten alle problemlos ausgeführt werden:

    Code:
    Create Table qtemp/mytable
    (A35#07 Integer,
     A45#08 VarChar(10));
     
    insert into myTable
    Values(1, 'AAA'), (2, 'BBB'), (3, 'CCC')
    With NC;                
    
    Select A35#07, A45#08
      from MyTable
      Where A35#07 = 2
      Order By A45#08;
    Birgitta

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    17.537
    Schaut euch mal die Meldung noch mal genauer an:

    "SELECT/OMIT-Fehler in Feld Cast(Translate(STDDATIH_2.A35#07, *UNNAMED Table) AS Decimal(7,0)),"

    Mit dem Feldnamen hat das nichts zu tun (der wird erkannt) sondern mit einem fehlerhaften Vergleich.
    Das Feld A35#07 wird mit einem anderen Feld oder Konstanten in Decimal(7,0) verglichen (FELDB?). Dies führt beim Optimizer leider zum Problem des falschen casts, was zur Laufzeit dann zu einem Fehler führt, wenn der Inhalt nicht konvertierbar ist.
    Sieh zu, dass der Vergleichswert eher in CHAR gecastet wird.

    Was den Feldnamen angeht, so ist das "#"-Zeichen bei einer angepassten CCSID nicht mehr ansprechbar.
    Setze den Job z.B. auf CCSID(500) und das Feld wird nicht mehr gefunden, auch nicht in Anführungszeichen. Ganz schön fatal sowas, aber das ist ja ein anderes Thema.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: http://www.fuerchau.de/software/upload400.htm
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Sep 2017
    Beiträge
    12
    Habe das Statement jetzt auch aus anderen Gründen in Text umgebaut und mit Prepare verwendet.
    Falls du deine Testdatei noch hast probier mal so, wie es im Thema steht, also mit
    "order by case when :a = 12 then a35#07 else feldB end".

Ähnliche Themen

  1. CASE in Kombination mit IN
    Von mojo im Forum NEWSboard programmierung
    Antworten: 2
    Letzter Beitrag: 27-05-15, 11:01
  2. Liste mit Spoolfile-Attributen wird automatisch erzeugt / gedruckt
    Von JoergHamacher im Forum System i Hauptforum
    Antworten: 2
    Letzter Beitrag: 13-04-15, 10:38
  3. CRTSQLRPGI erzeugt 2 Wandlungsllisten
    Von dschroeder im Forum NEWSboard programmierung
    Antworten: 3
    Letzter Beitrag: 04-07-14, 11:20
  4. SQL update mit order by
    Von Robi im Forum System i Hauptforum
    Antworten: 3
    Letzter Beitrag: 22-05-03, 14:14
  5. Umfrage: Wie viel Umsatz erzeugt das Nb market im Monat?
    Von Burgy Zapp im Forum NEWSboard market
    Antworten: 5
    Letzter Beitrag: 08-07-02, 14:39

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •