View Full Version : 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.
Setzt mal den Feld-Namen in Anführungszeichen, also "A35#07".
Was passiert dann?
Birgitta
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.
KingofKning
02-03-18, 12:40
Es geht doch nichts über EDI-Probleme ;-)
Und wenn Du eine View darüber machst?
GG 4474
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
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
Ich habe gerade eine Datei generiert mit "exotischen" Feld-Namen und hatte keine Probleme.
Die folgenden Statements konnten alle problemlos ausgeführt werden:
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
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.
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".