PostgreSQL: ОШИБКА: оператор не существует: integer = character меняется

Здесь я пытаюсь создать представление, как показано ниже в примере:

Пример:

 create view view1
 as 
 select table1.col1,table2.col1,table3.col3
 from table1 
 inner join
 table2 
 inner join 
 table3
 on 
 table1.col4 = 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 */
 ....;

Примечание. Тот же запрос выполняется на сервере sql, но полученная выше ошибка в postgreSQL.

Ответы

Ответ 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.

Также обратите внимание, что приведение типов может привести к тому, что ваш индекс на этом столбце будет неработоспособным и имеет штраф за производительность, что довольно плохо. Еще лучшим решением было бы увидеть, можете ли вы навсегда изменить один из двух типов столбцов, чтобы он соответствовал другому. Буквально измените дизайн своей базы данных.

Или вы можете создать индекс для литых значений, используя настраиваемую, неизменяемую функцию, которая выдает значения в столбце. Но это тоже может оказаться неоптимальным (но лучше, чем живое кастинг).