Você está transmitindo seus valores de coluna para
char(n)
, que preencherá strings e números mais curtos (implicitamente convertidos em strings) para n chars e truncar valores mais longos. (Isso é melhor do que usar varchar2(n)
, o que geraria erros com números mais longos e não faria diferença para strings mais curtas). Você terá um problema com nulos, porém, como
cast(null as char(n))
- ou qualquer outra coisa - ainda é nulo, em vez de n espaços como você poderia esperar. Isso pode ser um problema para qualquer uma de suas colunas, mas principalmente para suas expressões de caso. Se alguma coluna puder ser nula, você poderá usar
nvl
ou coalesce
para tratá-los como um único espaço, e o elenco os preencherá também:cast(coalesce(First_name, ' ') as char(20))
Em vez de transmitir, você também pode usar
rpad()
:rpad(coalesce(First_name, ' '), 20, ' ')
Para as expressões case você pode fazer o
else
cláusula avalia para um único espaço em vez de nulo, mas você também precisa aplicar a conversão à expressão geral de maiúsculas e minúsculas, não dentro de um when
ramo; então ao invés disso:max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)
você faria:
cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
ou se preferir:
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))
Seu cliente pode estar preenchendo com a direita a string geral para o mesmo comprimento de qualquer maneira (o SQL*Plus fará isso se você
set trimout off
, ou se estiver em spool set trimspool off
; que pode ser o que BobC estava se referindo), mas isso não ajuda muito se o que você está realmente tentando criar são campos de comprimento fixo , que cumulativamente também forneceria um registro de comprimento fixo - e se você não tivesse campos de comprimento fixo, seria impossível interpretar os dados de qualquer maneira.