列の値をchar(n)
にキャストしています 、短い文字列と数値(暗黙的に文字列に変換される)を nに埋め込みます chars、およびより長い値を切り捨てます。 (これは、varchar2(n)
を使用するよりも優れています 、これは長い数字ではエラーになり、短い文字列には何の違いもありません。
ただし、cast(null as char(n))
のように、nullには問題があります。 -またはその他-はnではなく、まだnullです あなたが期待するかもしれないようにスペース。これは、どの列でも問題になる可能性がありますが、特にケース式では問題になる可能性があります。
いずれかの列がnullになる可能性がある場合は、nvl
を使用できます。 またはcoalesce
代わりにそれらを単一のスペースとして扱うと、キャストはそれらもパディングします:
cast(coalesce(First_name, ' ') as char(20))
キャストする代わりに、rpad()
を使用することもできます :
rpad(coalesce(First_name, ' '), 20, ' ')
ケース式の場合、else
を作成できます 句はnullではなく単一のスペースに評価されますが、キャストをケース式全体に適用する必要があります。1つのwhen
内にキャストを含めないでください。 ブランチ;したがって、これの代わりに:
max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)
あなたがするだろう:
cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
または必要に応じて:
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))
とにかく、クライアントが文字列全体を同じ長さに右パディングしている可能性があります(set trimout off
している場合は、SQL*Plusがそれを行います。 、またはスプーリングの場合set trimspool off
;これはBobCが参照していたものかもしれません)が、実際に作成しようとしているのが固定長のフィールドである場合、それは実際には役に立ちません。 、これは累積的に固定長のレコードも提供します。固定長のフィールドがない場合は、とにかくデータを解釈することはできません。