这里我试图创建如下例所示的视图:
示例:
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 server中执行相同的查询但在postgreSQL中遇到上述错误。
答案 0 :(得分:45)
我认为这确实告诉了你到底出了什么问题。您无法将整数与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 */
....;
注意table1.col4上的varchar
类型转换。
另请注意,类型转换可能会使该列上的索引无法使用并且性能下降,这非常糟糕。更好的解决方案是查看是否可以永久更改两种列类型中的一种以匹配另一种。彻底改变你的数据库设计。
或者,您可以使用自定义的不可变函数在转换值上创建索引,该函数会在列上转换值。但这也可能证明不是最理想的(但比现场演员更好)。