Přenášíte hodnoty sloupců do char(n)
, která vyplní kratší řetězce a čísla (implicitně převedená na řetězce) na n znaky a zkrátit delší hodnoty. (To je lepší než použití varchar2(n)
, což by u delších čísel bylo chybné a nedělalo by to žádný rozdíl u kratších řetězců).
Budete mít problém s hodnotami null, protože cast(null as char(n))
- nebo cokoli jiného - je stále null, spíše než n prostory, jak byste mohli očekávat. To může být problém pro kterýkoli z vašich sloupců, ale zejména pro výrazy velkých a malých písmen.
Pokud některé sloupce mohou být null, můžete použít nvl
nebo coalesce
místo toho s nimi zacházet jako s jedním prostorem a obsazení je pak vyplní také:
cast(coalesce(First_name, ' ') as char(20))
Spíše než casting můžete také použít rpad()
:
rpad(coalesce(First_name, ' '), 20, ' ')
Pro výrazy typu case můžete použít else
klauzule se vyhodnotí na jednu mezeru místo null, ale přetypování je také potřeba použít na celkový výraz případu, nikoli jej mít v rámci jednoho when
větev; takže místo tohoto:
max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)
udělali byste:
cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
nebo chcete-li:
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))
Váš klient stejně mohl správně doplnit celkový řetězec na stejnou délku (SQL*Plus to udělá, pokud jste set trimout off
, nebo při zařazování set trimspool off
; což by mohlo být to, o čem BobC odkazoval), ale to opravdu nepomůže, pokud to, co se skutečně snažíte vytvořit, jsou pole s pevnou délkou , což by vám kumulativně dalo také záznam s pevnou délkou – a pokud byste neměli pole s pevnou délkou, bylo by stejně nemožné data interpretovat.