PostgreSQL:错误:运算符不存在:整数=字符变化


72

在这里,我尝试创建如下例所示的视图:

例:

 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中出现上述错误。

Answers:


77

我认为这是在告诉您确切的问题。您不能将整数与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 */
....;

注意varchartable1.col4上的类型转换。

还要注意,类型转换可能会使该列上的索引无法使用,并且会降低性能,这是非常糟糕的。更好的解决方案是查看是否可以永久更改两种列类型之一以匹配另一种。彻底改变您的数据库设计。

或者,您可以使用自定义的,不可变的函数将强制转换的值投射到列上,从而在强制转换的值上创建索引。但这也可能证明不是最佳选择(但比现场直播更好)。


13
确切地说,PostgreSQL在8.2中做到了“神奇”。它在8.3中停止这样做。
Nux
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.