Tôi nghĩ rằng nó đang cho bạn biết chính xác những gì là sai. Bạn không thể so sánh một số nguyên với một varchar. PostgreSQL nghiêm ngặt và không thực hiện bất kỳ thao tác đánh máy kỳ diệu nào cho bạn. Tôi đoán SQLServer thực hiện đánh máy tự động (đó là một điều tồi tệ).
Nếu bạn muốn so sánh hai con thú khác nhau này, bạn sẽ phải truyền con này sang con kia bằng cú pháp ép kiểu ::
.
Điều gì đó dọc theo những dòng này:
create view view1
as
select table1.col1,table2.col1,table3.col3
from table1
inner join
table2
inner join
table3
on
table1.col4::varchar = table2.col5
/* Here col4 of table1 is of "integer" type and col5 of table2 is of type "varchar" */
/* ERROR: operator does not exist: integer = character varying */
....;
Lưu ý varchar
đánh máy trên table1.col4.
Cũng lưu ý rằng việc đánh máy có thể khiến chỉ mục của bạn trên cột đó không thể sử dụng được và có một hình phạt về hiệu suất, điều này khá tệ. Một giải pháp thậm chí còn tốt hơn là xem liệu bạn có thể thay đổi vĩnh viễn một trong hai loại cột để phù hợp với loại cột kia hay không. Thay đổi rõ ràng thiết kế cơ sở dữ liệu của bạn.
Hoặc bạn có thể tạo chỉ mục trên các giá trị được truyền bằng cách sử dụng tùy chỉnh, không thể thay đổi hàm truyền các giá trị trên cột. Nhưng điều này cũng có thể chứng minh là không tối ưu (nhưng tốt hơn truyền trực tiếp).