Estás convirtiendo los valores de tu columna en char(n)
, que rellenará cadenas y números más cortos (implícitamente convertidos en cadenas) a n caracteres y truncar los valores más largos. (Esto es mejor que usar varchar2(n)
, que daría error con números más largos y no haría ninguna diferencia con cadenas más cortas).
Sin embargo, tendrá un problema con los valores nulos, ya que cast(null as char(n))
- o cualquier otra cosa - sigue siendo nulo, en lugar de n espacios como cabría esperar. Eso puede ser un problema para cualquiera de sus columnas, pero particularmente para sus expresiones de casos.
Si alguna columna puede ser nula, puede usar nvl
o coalesce
para tratarlos como un solo espacio en su lugar, y el elenco también los rellenará:
cast(coalesce(First_name, ' ') as char(20))
En lugar de transmitir, también podría usar rpad()
:
rpad(coalesce(First_name, ' '), 20, ' ')
Para las expresiones de caso, puede hacer else
la cláusula se evalúa en un solo espacio en lugar de nulo, pero también debe aplicar la conversión a la expresión de caso general, no tenerla dentro de un when
rama; así que en lugar de esto:
max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)
harías:
cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
o si lo prefieres:
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))
Es posible que su cliente haya estado rellenando a la derecha la cadena general a la misma longitud de todos modos (SQL*Plus lo hará si tiene set trimout off
, o si se pone en cola set trimspool off
; que podría ser a lo que se refería BobC), pero eso realmente no ayuda si lo que realmente está tratando de crear son campos de longitud fija , que acumulativamente también le daría un registro de longitud fija, y si no tuviera campos de longitud fija, sería imposible interpretar los datos de todos modos.