Прехвърляте стойностите на колоните си към char(n)
, което ще допълни по-къси низове и числа (неявно преобразувани в низове) до n chars и отрязва по-дълги стойности. (Това е по-добре от използването на varchar2(n)
, което би довело до грешка при по-дълги числа и няма да има никаква разлика при по-къси низове).
Все пак ще имате проблем с нули, тъй като cast(null as char(n))
- или нещо друго - все още е нула, а не n пространства, както може да очаквате. Това може да е проблем за която и да е от вашите колони, но особено за вашите изрази за регистър.
Ако някои колони могат да бъдат нулеви, можете да използвате nvl
или coalesce
за да ги третира вместо това като едно пространство и актьорският състав след това ще запълни и тях:
cast(coalesce(First_name, ' ') as char(20))
Вместо кастинг, можете също да използвате rpad()
:
rpad(coalesce(First_name, ' '), 20, ' ')
За изразите за регистър можете да направите else
клауза оценява на единичен интервал вместо null, но вие също трябва да приложите преобразуването към общия израз на case, а не да го имате в рамките на един when
клон; така че вместо това:
max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)
бихте направили:
cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
или ако предпочитате:
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))
Вашият клиент може така или иначе да е допълвал надясно целия низ до същата дължина (SQL*Plus ще направи това, ако сте set trimout off
, или ако се спулира set trimspool off
; което може да е това, за което BobC имаше предвид), но това всъщност не помага, ако това, което наистина се опитвате да създадете, са полета с фиксирана дължина , което кумулативно ще ви даде и запис с фиксирана дължина - и ако нямате полета с фиксирана дължина, така или иначе би било невъзможно да интерпретирате данните.