PostgreSQL:错误:运算符不存在:integer = character varying

116

我将尝试创建如下示例所示的视图:

示例:

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

1个回答

136

我认为它清楚地告诉了你问题所在。你不能将整数与字符型数据进行比较。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 类型转换。

还要注意,类型转换可能使该列上的索引无法使用,并会产生性能损失,这是非常糟糕的。更好的解决方案是尝试是否可以永久更改其中一个列类型以匹配另一个列类型。从字面上改变你的数据库设计。

或者您可以通过使用自定义的 不可变 函数在转换后的列上创建索引。但这也可能证明不是最优的方法(但比即时转换要好)。


23
确切地说,PostgreSQL 在8.2版本中做了这个“魔法”,但在8.3版本中停止了这种行为。 - Nux
1
解决了我的问题。此外,我发现“beasts”的使用非常有趣。 - Blair Nangle
2
当你使用JPA时遇到这个问题,请确保你的枚举类型有@Enumerated(EnumType.STRING)注解。 - 8bitme
@8bitme 在JPA中,我们如何为日期时间列添加数据? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接