Myslím, že to přesně říká, co je špatně. Nemůžete porovnávat celé číslo s varchar. PostgreSQL je přísný a nedělá za vás žádné magické přetypování. Hádám, že SQLServer provádí přetypování automaticky (což je špatná věc).
Pokud chcete porovnat tyto dvě různé bestie, budete si muset jednu na druhou přehodit pomocí syntaxe castingu ::
.
Něco v tomto smyslu:
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 */
....;
Všimněte si varchar
typové obsazení na table1.col4.
Všimněte si také, že typové obsazení může způsobit, že váš index v tomto sloupci bude nepoužitelný a bude mít snížení výkonu, což je docela špatné. Ještě lepším řešením by bylo zjistit, zda můžete trvale změnit jeden ze dvou typů sloupců, aby odpovídal druhému. Doslova změňte návrh databáze.
Nebo můžete vytvořit index přetypovaných hodnot pomocí vlastního, neměnného funkce, která přenáší hodnoty na sloupec. Ale i to se může ukázat jako suboptimální (ale lepší než živé vysílání).