Przesyłasz wartości kolumn do char(n)
, który dopełni krótsze ciągi i liczby (domyślnie zamienione na ciągi) do n znaków i obcinaj dłuższe wartości. (Jest to lepsze niż użycie varchar2(n)
, co powodowałoby błąd przy dłuższych liczbach i nie miałoby żadnego wpływu na krótsze łańcuchy).
Będziesz miał jednak problem z wartościami null, ponieważ cast(null as char(n))
- lub cokolwiek innego - nadal ma wartość null, a nie n przestrzenie, jak można się spodziewać. Może to stanowić problem w przypadku każdej z Twoich kolumn, ale szczególnie w przypadku wyrażeń wielkości liter.
Jeśli jakiekolwiek kolumny mogą być puste, możesz użyć nvl
lub coalesce
traktować je jako pojedynczą spację, a rzutowanie również je uzupełni:
cast(coalesce(First_name, ' ') as char(20))
Zamiast rzutowania możesz również użyć rpad()
:
rpad(coalesce(First_name, ' '), 20, ' ')
W przypadku wyrażeń wielkości liter możesz utworzyć else
Klauzula ocenia się na pojedynczą spację zamiast null, ale musisz również zastosować rzutowanie do ogólnego wyrażenia case, nie umieszczaj go w jednym when
oddział; więc zamiast tego:
max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)
byś zrobił:
cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
lub jeśli wolisz:
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))
Twój klient mógł i tak dopełniał cały ciąg znaków do tej samej długości (SQL*Plus zrobi to, jeśli set trimout off
, lub jeśli buforowanie set trimspool off
; co może być tym, o czym mówił BobC), ale to nie pomaga, jeśli tak naprawdę próbujesz stworzyć pola o stałej długości , co łącznie dałoby również rekord o stałej długości - a jeśli nie miałbyś pól o stałej długości, i tak nie byłoby możliwe zinterpretowanie danych.