Penso che ti stia dicendo esattamente cosa c'è che non va. Non puoi confrontare un numero intero con un varchar. PostgreSQL è rigoroso e non esegue alcun typecasting magico per te. Immagino che SQLServer esegua il typecast automaticamente (che è una brutta cosa).
Se vuoi confrontare queste due diverse bestie, dovrai lanciare l'una sull'altra usando la sintassi del casting ::
.
Qualcosa del genere:
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 */
....;
Nota il varchar
typecasting su table1.col4.
Nota anche che il typecasting potrebbe rendere inutilizzabile il tuo indice su quella colonna e ha una penalizzazione delle prestazioni, il che è piuttosto negativo. Una soluzione ancora migliore sarebbe vedere se è possibile modificare permanentemente uno dei due tipi di colonna in modo che corrisponda all'altro. Cambia letteralmente il design del tuo database.
Oppure potresti creare un indice sui valori cast utilizzando un immutabile personalizzato funzione che esegue il cast dei valori sulla colonna. Ma anche questo potrebbe rivelarsi non ottimale (ma meglio del casting dal vivo).