sql >> Base de Datos >  >> RDS >> Oracle

Producir un archivo de salida de formato plano de ancho fijo a partir de una consulta SQL

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.