View Full Version : 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.
SELECT KJH concat KJJ concat KMM concat KTT FROM PKALEND
Wie müsste das Sql-Statement aussehen?
Dank im Voraus
Digits(xx) liefert auch die Vornullen.
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?
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.
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.
woodstock99
23-06-14, 15:31
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
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:).
woodstock99
23-06-14, 16:01
man muss nur schauen das der dieter nicht im haus ist :D. ansonsten rauchts ;)
man muss nur schauen das der dieter nicht im haus ist :D. 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
Aber auch in der Kreisklasse wird schon nach Performance gerufen:).