Điều đó được quyết định bởi các quy tắc của Độ phân giải loại hàm . Giải thích chi tiết trong sách hướng dẫn. Có liên quan:
- Có cách nào để tắt tính năng quá tải trong Postgres không
NULL không có kiểu rõ ràng bắt đầu bằng kiểu "không xác định":
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
Trên thực tế, Tôi đã nghi ngờ và chạy một bài kiểm tra nhanh, chỉ để tìm thấy các kết quả khác nhau trong Postgres 9.3 và 9.4. varchar
được chọn qua integer
(mà kỳ lạ mâu thuẫn với những phát hiện của bạn):
SQL Fiddle.
Tôi nghĩ rằng quy tắc theo quy tắc là điểm 4e trong danh sách (không có điểm nào trước đó quyết định trận đấu):
Tại mỗi vị trí, hãy chọn danh mục chuỗi nếu có ứng viên chấp nhận danh mục đó. (Sự thiên vị đối với chuỗi này là phù hợp vì ký tự kiểu không xác định trông giống như một chuỗi.)
Nếu bạn đã thêm một hàm khác với kiểu nhập text
vào hỗn hợp quá tải, text
sẽ được chọn qua varchar
.
Cá nhân tôi hầu như luôn luôn sử dụng text
thay vì varchar
. Mặc dù tương thích với hệ nhị phân (gần như nhưng không hoàn toàn giống nhau), text
gần với trung tâm của Postgres hơn về mọi mặt.
Tôi đã thêm điều đó vào fiddle, cũng như một ví dụ khác mà Postgres không thể quyết định và nổi cơn thịnh nộ.
Nếu bạn muốn chọn một hàm cụ thể, hãy thêm kiểu ép kiểu rõ ràng (đó là cách để thực hiện ở đây!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;