Jeg tror, det fortæller dig præcis, hvad der er galt. Du kan ikke sammenligne et heltal med en varchar. PostgreSQL er streng og udfører ingen magisk typecasting for dig. Jeg gætter på, at SQLServer udfører typecasting automagisk (hvilket er en dårlig ting).
Hvis du vil sammenligne disse to forskellige dyr, skal du caste det ene til det andet ved hjælp af casting-syntaksen ::
.
Noget i denne retning:
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æg mærke til varchar
typecasting på table1.col4.
Bemærk også, at typecasting muligvis kan gøre dit indeks på den kolonne ubrugelig og har en ydeevnestraf, hvilket er ret dårligt. En endnu bedre løsning ville være at se, om du permanent kan ændre en af de to kolonnetyper, så den matcher den anden. Ændr bogstaveligt talt dit databasedesign.
Eller du kan oprette et indeks over de castede værdier ved at bruge en tilpasset, uforanderlig funktion som kaster værdierne på kolonnen. Men også dette kan vise sig at være suboptimalt (men bedre end live casting).