Ответ 1
Я думаю, это говорит вам точно, что не так. Вы не можете сравнить целое число с varchar. PostgreSQL является строгим и не делает никакого волшебного приведения типов для вас. Я предполагаю, что SQLServer автоматически печатает (что плохо).
Если вы хотите сравнить этих двух разных зверей, вам придется отбрасывать один на другой с помощью синтаксиса каста ::
.
Что-то в этом роде:
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 */
....;
Обратите внимание на varchar
typecasting на table1.col4.
Также обратите внимание, что приведение типов может привести к тому, что ваш индекс на этом столбце будет неработоспособным и имеет штраф за производительность, что довольно плохо. Еще лучшим решением было бы увидеть, можете ли вы навсегда изменить один из двух типов столбцов, чтобы он соответствовал другому. Буквально измените дизайн своей базы данных.
Или вы можете создать индекс для литых значений, используя настраиваемую, неизменяемую функцию, которая выдает значения в столбце. Но это тоже может оказаться неоптимальным (но лучше, чем живое кастинг).