Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erstellen Sie aus einer SQL-Abfrage eine Ausgabedatei im Flat-Format mit fester Breite

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.