Bạn đang truyền các giá trị cột của mình thành char(n)
, sẽ chèn các chuỗi và số ngắn hơn (được chuyển đổi hoàn toàn thành chuỗi) thành n ký tự và cắt bớt các giá trị dài hơn. (Điều này tốt hơn là sử dụng varchar2(n)
, điều này sẽ gây ra lỗi với các số dài hơn và sẽ không tạo ra bất kỳ sự khác biệt nào đối với các chuỗi ngắn hơn).
Tuy nhiên, bạn sẽ gặp sự cố với null, vì cast(null as char(n))
- hoặc bất cứ điều gì khác - vẫn là rỗng, thay vì n không gian như bạn có thể mong đợi. Đó có thể là vấn đề đối với bất kỳ cột nào của bạn, nhưng đặc biệt là đối với các biểu thức chữ viết hoa của bạn.
Nếu bất kỳ cột nào có thể là rỗng, bạn có thể sử dụng nvl
hoặc coalesce
thay vào đó, coi chúng như một không gian duy nhất và dàn diễn viên cũng sẽ đệm chúng:
cast(coalesce(First_name, ' ') as char(20))
Thay vì truyền, bạn cũng có thể sử dụng rpad()
:
rpad(coalesce(First_name, ' '), 20, ' ')
Đối với các biểu thức chữ hoa, bạn có thể tạo else
mệnh đề đánh giá thành một khoảng trắng duy nhất thay vì null, nhưng bạn cũng cần áp dụng ép kiểu cho biểu thức viết hoa tổng thể, không đặt nó trong một when
chi nhánh; vì vậy thay vì thế này:
max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)
bạn sẽ làm:
cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
hoặc nếu bạn thích:
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))
Khách hàng của bạn có thể đã đệm phải chuỗi tổng thể về cùng độ dài (SQL * Plus sẽ thực hiện điều đó nếu bạn đã set trimout off
hoặc nếu spooling set trimspool off
; có thể là những gì BobC đang đề cập đến), nhưng điều đó không thực sự hữu ích nếu những gì bạn thực sự đang cố gắng tạo là trường có độ dài cố định , tính năng này cũng sẽ cung cấp cho bạn một bản ghi độ dài cố định - và nếu bạn không có các trường độ dài cố định thì dù sao cũng không thể diễn giải dữ liệu.