Ik denk dat het je precies vertelt wat er mis is. Je kunt een geheel getal niet vergelijken met een varchar. PostgreSQL is streng en doet geen magische typecasting voor u. Ik vermoed dat SQLServer automagisch typecast doet (wat een slechte zaak is).
Als je deze twee verschillende beesten wilt vergelijken, moet je de ene naar de andere casten met behulp van de casting-syntaxis ::
.
Iets in de trant van:
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 */
....;
Let op de varchar
typecasting op table1.col4.
Houd er ook rekening mee dat typecasting uw index op die kolom mogelijk onbruikbaar kan maken en een prestatiestraf heeft, wat behoorlijk slecht is. Een nog betere oplossing zou zijn om te kijken of u een van de twee kolomtypen permanent kunt wijzigen zodat deze overeenkomt met de andere. Verander letterlijk uw database-ontwerp.
Of u kunt een index maken op de gegoten waarden met behulp van een aangepaste, onveranderlijke functie die de waarden op de kolom cast. Maar ook dit kan niet optimaal zijn (maar beter dan live casten).