Myślę, że mówi ci dokładnie, co jest nie tak. Nie można porównać liczby całkowitej z varchar. PostgreSQL jest rygorystyczny i nie wykonuje za Ciebie żadnego magicznego rzutowania typów. Zgaduję, że SQLServer wykonuje rzutowanie typów automagicznie (co jest złe).
Jeśli chcesz porównać te dwie różne bestie, będziesz musiał rzucić je na siebie, używając składni rzucania ::
.
Coś w tym stylu:
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 */
....;
Zwróć uwagę na varchar
rzutowanie typu na table1.col4.
Zauważ też, że rzutowanie typów może spowodować, że twój indeks w tej kolumnie stanie się bezużyteczny i spowoduje spadek wydajności, co jest dość złe. Jeszcze lepszym rozwiązaniem byłoby sprawdzenie, czy możesz na stałe zmienić jeden z dwóch typów kolumn, aby pasował do drugiego. Dosłownie zmień projekt bazy danych.
Możesz też utworzyć indeks dla rzutowanych wartości, używając niestandardowego, niezmiennego funkcja, która rzutuje wartości na kolumnę. Ale to też może okazać się nieoptymalne (ale lepsze niż casting na żywo).