Creo que te está diciendo exactamente lo que está mal. No puede comparar un número entero con un varchar. PostgreSQL es estricto y no hace ningún encasillamiento mágico por usted. Supongo que SQLServer encasilla automáticamente (lo cual es algo malo).
Si quieres comparar estas dos bestias diferentes, tendrás que lanzar una a la otra usando la sintaxis de conversión ::
.
Algo así:
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 el varchar
encasillando en la tabla1.col4.
También tenga en cuenta que el encasillamiento posiblemente haga que su índice en esa columna quede inutilizable y tenga una penalización de rendimiento, lo cual es bastante malo. Una solución aún mejor sería ver si puede cambiar permanentemente uno de los dos tipos de columna para que coincida con el otro. Cambia literalmente el diseño de tu base de datos.
O podría crear un índice en los valores emitidos mediante el uso de un inmutable personalizado. función que proyecta los valores en la columna. Pero esto también puede resultar subóptimo (pero mejor que la transmisión en vivo).