Du castar dina kolumnvärden till char(n)
, som fyller kortare strängar och siffror (implicit konverterade till strängar) till n chars och trunkerar längre värden. (Detta är bättre än att använda varchar2(n)
, vilket skulle fela med längre nummer och inte skulle göra någon skillnad för kortare strängar).
Du kommer dock att ha problem med nollvärden, eftersom cast(null as char(n))
- eller något annat - är fortfarande null, snarare än n utrymmen som du kan förvänta dig. Det kan vara ett problem för vilken som helst av dina kolumner, men särskilt för dina case-uttryck.
Om några kolumner kan vara null kan du använda nvl
eller coalesce
för att behandla dem som ett enda utrymme istället, så kommer rollbesättningen att fylla dem också:
cast(coalesce(First_name, ' ') as char(20))
Istället för att casta kan du också använda rpad()
:
rpad(coalesce(First_name, ' '), 20, ' ')
För kasusuttrycken kan du göra else
satsen utvärderas till ett enstaka mellanslag istället för null, men du måste också tillämpa casten på det övergripande kasusuttrycket, inte ha det inom en when
gren; så istället för detta:
max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)
du skulle göra:
cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
eller om du föredrar:
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))
Din klient kan ha högerutfyllt den övergripande strängen till samma längd ändå (SQL*Plus kommer att göra det om du har set trimout off
, eller om spoolning set trimspool off
; vilket kan vara vad BobC syftade på), men det hjälper inte riktigt om det du verkligen försöker skapa är fält med fast längd , vilket kumulativt skulle ge dig en post med fast längd också - och om du inte hade fält med fast längd skulle det ändå vara omöjligt att tolka datan.