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.