Sie wandeln Ihre Spaltenwerte in char(n)
um , wodurch kürzere Zeichenfolgen und Zahlen (implizit in Zeichenfolgen konvertiert) zu n aufgefüllt werden Zeichen und kürzen längere Werte. (Das ist besser als die Verwendung von varchar2(n)
, was bei längeren Zahlen zu einem Fehler führen würde und bei kürzeren Zeichenfolgen keinen Unterschied machen würde).
Sie werden jedoch ein Problem mit Nullen haben, da cast(null as char(n))
- oder irgendetwas anderes - ist immer noch null und nicht n Leerzeichen wie erwartet. Das kann für jede Ihrer Spalten ein Problem sein, besonders aber für Ihre Groß-/Kleinschreibung.
Wenn irgendwelche Spalten null sein können, können Sie nvl
verwenden oder coalesce
um sie stattdessen als einzelnes Leerzeichen zu behandeln, und die Besetzung füllt diese dann auch auf:
cast(coalesce(First_name, ' ') as char(20))
Anstatt zu casten, könnten Sie auch rpad()
verwenden :
rpad(coalesce(First_name, ' '), 20, ' ')
Für die Case-Ausdrücke können Sie else
verwenden -Klausel auf ein einzelnes Leerzeichen anstelle von null auswerten, aber Sie müssen die Umwandlung auch auf den gesamten case-Ausdruck anwenden, nicht innerhalb eines when
Zweig; also statt dessen:
max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)
Sie würden Folgendes tun:
cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
oder wenn Sie es vorziehen:
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))
Möglicherweise hat Ihr Client die Gesamtzeichenfolge sowieso auf die gleiche Länge rechts aufgefüllt (SQL*Plus wird dies tun, wenn Sie set trimout off
, oder beim Spoolen set trimspool off
; was BobC gemeint haben könnte), aber das hilft nicht wirklich, wenn Sie wirklich versuchen, Felder mit fester Länge zu erstellen , was Ihnen kumulativ auch einen Datensatz mit fester Länge geben würde - und wenn Sie keine Felder mit fester Länge hätten, wäre es sowieso unmöglich, die Daten zu interpretieren.