-
Listagg fügt Zeichen dazu
Moin zusammen
Feldgrößen:
xxkey1 7,0
xxsunr 7,0
xxsun2 1,0
xxmk 3,0
xxmst 3,0
name 24A
ich habe hier ein
Code:
select substr(listagg(digits(xxKey1), ', ' on overflow truncate), 1, 53) as xxkeys,
substr(listagg(digits(dec(xxsunr*10+xxsun2, 8, 0))
concat digits(xxmk) concat digits(xxmst)
concat (select substr(name, 1, 18)
from FILE2
where sunr=xxsunr and sun2=xxsun2), ''
on overflow truncate), 1, 203) as DATEN,
count(*) as anzahl
from FILE1 where ...
im STRSQL
ist xxkeys
1234567, 8901234, 5678901, ....
im embeddet sql ist das
1234567,08901234,05678901, .... Immer eine 0 statt ein Blank
Daten hat in dem Abschnitt der den Namen beinhaltet
Code:
STRSQL
im ersten Namen
ABCD11111111111
alle anderen
ABCD ABCD ABCD
und im embeddet SQL
ABCD111111111111 und ABCD00000000000 ABCD00000000000 usw.
Fehler im meiner Syntax?
Oder im SQL
Es geht um eine Schnittstelle, die Daten hole ich mittlerweile native mit lesen in Schleife.
Das war halt eine einfache Umsetzung mit dem Listagg
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Eine Erklärung habe ich nicht! Vermutlich kommt er durch die Numerischen Felder ins Schleudern.
Wenn anstatt eines *BLANKS eine Null (0) eingefügt wird, sieht das wie ein Bug aus.
Ich würde mal bei der IBM nachfragen.
-
Mit STRSQL würde ich das nicht vergleichen wollen. Hier wäre eher die Verwendung von SQL-Script (via ACS) zu verwenden um vergleichbare Ergebnisse zu embedded zu erhalten.
Ggf. ist zu prüfen, ob "substr(name, 1, 18)" ein Char-Ergebnis hat und ggf. noch mit "trim(...)" von Leerzeichen am Ende entfernt werden muss, was eben zusätzliche Leerzeichen erklären könnte.
Auch verstehe ich deine Ergebnisdarstellung ABCD111111111 nicht, da der Name im Listagg ja erst am Ende angefügt wird.
Im Ergebnis müsste also eine 14-stellige Zahl (8+2*3) von einem 18-stelligen Namen (substr) gefolgt sein.
-
Moin,
Vorab: Es scheint ein 'Speicherfehler' zu sein.
Das Ergebnis ist immer anders bei gleichen abgefragten Werten.
Heute Ist XXKEY im embeddet richtig und in DATEN ist nur der 2. Name mit 111111 aufgefüllt.
@Birgitta : das habe ich befürchtet. Leider als Externer für einen Konzern mit outgesourster Hardware so einfach wie im Lotto zu gewinnen ...
@Baldur
Trim und Trim mit concat ' ' und substr drumherum habe ich alles versucht, das funktioniert nicht
Der DATEN String sieht so aus: (diesmal alle Stellen ausgezählt)
12345678001001abcBBBBBBBBBBBBBBB12345778001001abc1 1111111111111177745678002123abc000000000000000
Die BBB sind Leerzeichen
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Die Darstellung sieht zumindest zu deinem LIST_AGG passend aus, da ohne Trennzeichen.
12345678001001 = 14 stellig
abcBBBBBBBBBBBBBBB = 18 stellig
Bei "abc1111..." und "abc0000...." stellt sich die Frage, was denn in "name" wirklich drinsteht um von einem Fehler auszugehen.
Kannst du dir denn die Rohdaten, also nur list_agg, mit den concats native ansehen?
-
Na ja, das ist schon so wie ich schrieb
(wir haben in den Testumgebungen mannipulierten Daten.)
einer der Testkunden heist mit Nachnamen abc (dsgvo lässt grüßen)
und im xxKEY habe ich beim 3. Aufruf nun auch wieder
12345678,012345678,012345678 anstatt
12345678, 12345678, 12345678
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Dann bleibts wohl bei der Meldung an die IBM.
-
 Zitat von Robi
@Birgitta : das habe ich befürchtet. Leider als Externer für einen Konzern mit outgesourster Hardware so einfach wie im Lotto zu gewinnen ...
Versteh' ich, geht mir ähnlich! Da hilft auch mein direkter Draht ins Lab in Rochester nicht. Von dort bekomme ich höchstens die Bestätigung, dass es sich um einen Bug handelt. ... melden muss ich den dann "irgendwie" selber.
-
Vielleicht heißt es auch, den List_agg zu überlisten.
Versuche mal, den "digists .... concat ...." in einen char(digits.... concat ....) zu casten.
Alternativ auch als cast(digits .... as char(32)) versuchen.
Ggf. passt nur was in der Operatorfolge nicht.
Auch ein
digts(decimal( (( xxsunr*10+xxsun2 ) * 1000 + xxmk) * 1000 + xxmst, 14, 0)) concat (select ...)
Statt des operators concat gibts auch die Funktion concat(a, b), die dann geschachtelt werden muss.
Vielleicht stört auch die unnötige Multiplikation
digits(xxsunr) concat digits(xxsun2)
so dass du den cast auf dec() nicht benötigst.
-
also das 'Beste' Ergebnis habe ich nun mit dem
digits(xxsunr) concat digits(xxsun2) ...
anstatt
digits(dec(xxsunr*10+xxsun2, 8, 0)) bekommen
aber leider ist das nich wirklich aussage kräftig.
Das Ergebnis ist jetzt im embeddet immer noch in einem 'Namen' falsch.
Bei mehreren aufrufen mit verschiedenen selektionen
Aber es war ja vorher auch mal mehr mal weniger falsch.
Also kann ich nicht mit Sicherheit bestätigen das es 'besser' ist.
Falsch ist falsch, ob ein bisschen oder komplett.
mal sehen ob ich eine Meldung an IBM raus bekomme.
Vielen Dank Euch
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
selbst ein
select substr(Trim(name) concat '18blank', 1, 18) bringt ein ergebnis in dem in einem Namen
abc111111111...
steht
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Das meinte ich ja nicht, sondern den gesamten berechneten Ausdruck des LIST_AGG in ein char casten.
Aber es gibt ja noch andere Methoden, auch wenn Birgitta wieder einen Aufschrei hat.
Ggf. hilft hier eine Zerlegung des Ausdrucks in Einzelschritte:
Code:
select substr(listagg(digits(xxKey1), ', ' on overflow truncate), 1, 53) as xxkeys,
substr(listagg(digits(dec(xxsunr*10+xxsun2, 8, 0))
concat digits(xxmk) concat digits(xxmst)
concat (select substr(name, 1, 18)
from FILE2
where sunr=xxsunr and sun2=xxsun2), ''
on overflow truncate), 1, 203) as DATEN,
count(*) as anzahl
from FILE1 where ...
Mittels "cross join lateral" lassen sich Zwischenergebnisse in ein eigenes Resultset vorab berechnen, so dass sie im Select gleich verwendet werden können.
Das hat den Vorteil, dass SQL die Methden etwas anders verwenden muss:
Prinzip:
Code:
cross join lateral (
values(expressionlist)
) x (namelist)
Hier also:
Code:
select
substr(listagg(ListArg, ''
on overflow truncate), 1, 203) as DATEN,
from FILE1
cross join lateral (
select substr(name, 1, 18) Teil2
from FILE2
where sunr=xxsunr and sun2=xxsun2
) tn
cross coin lateral (
values(digits(dec(xxsunr*10+xxsun2, 8, 0))
concat digits(xxmk) concat digits(xxmst)
concat tn.Teil2
)
) t1 (ListArg)
where ...
Der Cross join lateral wird wie ein scalarer Subselect je Zeile einzeln auferufen und erzeugt dann ein einzelnes Resultset.
Similar Threads
-
By Robi in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 19-03-26, 08:15
-
By Robi in forum NEWSboard Programmierung
Antworten: 29
Letzter Beitrag: 02-06-25, 11:05
-
By mahones in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 06-07-17, 15:47
-
By malzusrex in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 23-08-06, 17:12
-
By alex in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 31-05-06, 14:26
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks