sql >> Database >  >> RDS >> Oracle

Produceer een uitvoerbestand met een vaste breedte in plat formaat van een SQL-query

U cast uw kolomwaarden naar char(n) , die kortere tekenreeksen en getallen (impliciet geconverteerd naar tekenreeksen) opvult naar n tekens en kappen langere waarden af. (Dit is beter dan het gebruik van varchar2(n) , wat fout zou gaan bij langere getallen en geen verschil zou maken voor kortere strings).

Je zult echter een probleem hebben met nulls, zoals cast(null as char(n)) - of iets anders - is nog steeds null, in plaats van n ruimtes zoals je zou verwachten. Dat kan een probleem zijn voor al uw kolommen, maar vooral voor uw case-expressies.

Als kolommen null kunnen zijn, kunt u nvl . gebruiken of coalesce om ze in plaats daarvan als een enkele spatie te behandelen, en de cast zal die dan ook opvullen:

cast(coalesce(First_name, ' ') as char(20))

In plaats van te casten, kunt u ook rpad() . gebruiken :

rpad(coalesce(First_name, ' '), 20, ' ')

Voor de case-expressies kunt u de else clausule evalueren tot een enkele spatie in plaats van null, maar u moet de cast ook toepassen op de algemene hoofdletterexpressie, niet binnen één when tak; dus in plaats van dit:

max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)

je zou doen:

cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))

of als je wilt:

cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))

Het kan zijn dat uw klant de algemene string toch naar rechts heeft ingevuld tot dezelfde lengte (SQL*Plus zal dat doen als u set trimout off , of als spoolen set trimspool off; dat zou kunnen zijn waar BobC naar verwees), maar dat helpt niet echt als wat je echt probeert te creëren, velden met een vaste lengte zijn , wat u cumulatief ook een record met een vaste lengte zou geven - en als u geen velden met een vaste lengte had, zou het toch onmogelijk zijn om de gegevens te interpreteren.



  1. Mysql-query die twee keer wordt uitgevoerd, moet de tweede keer sneller zijn, zelfs met SQL_NO_CACHE

  2. PIVOT-, UNPIVOT- en Reverse PIVOT-statements begrijpen

  3. Een tekenreeks converteren naar kleine letters in SQL

  4. filter mysql-replicatie (ignore-db)