Eu acho que está dizendo exatamente o que está errado. Você não pode comparar um inteiro com um varchar. O PostgreSQL é estrito e não faz nenhum tipo de conversão mágica para você. Eu estou supondo que o SQLServer faz typecasting automaticamente (o que é uma coisa ruim).
Se você quiser comparar essas duas feras diferentes, terá que converter uma na outra usando a sintaxe de conversão
::
. Algo nesse sentido:
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 */
....;
Observe o
varchar
typecasting na tabela1.col4. Observe também que o typecasting pode tornar seu índice nessa coluna inutilizável e tem uma penalidade de desempenho, o que é muito ruim. Uma solução ainda melhor seria ver se você pode alterar permanentemente um dos dois tipos de coluna para corresponder ao outro. Mude literalmente o design do seu banco de dados.
Ou você pode criar um índice nos valores convertidos usando um personalizado, imutável função que converte os valores na coluna. Mas isso também pode se mostrar abaixo do ideal (mas melhor do que a transmissão ao vivo).