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

Mee*_*eem 52 postgresql varchar integer casting

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

例:

 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 */
 ....;
Run Code Online (Sandbox Code Playgroud)

注意:在sql server中执行相同的查询但在postgreSQL中遇到上述错误.

Tim*_*san 56

我认为它告诉你到底出了什么问题.您无法将整数与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 */
....;
Run Code Online (Sandbox Code Playgroud)

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

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

或者,您可以使用自定义的不可变函数在已转换的值上创建索引,该函数会在列上强制转换值.但这也可能证明不是最理想的(但比现场演员更好).

  • 确切地说,PostgreSQL在8.2中做了"魔术".它在8.3中停止了这样做. (8认同)
  • 解决了我的问题。另外,我发现使用“野兽”是最令人愉快的。 (2认同)
  • 如果您在使用 JPA 时遇到此问题,请确保您的枚举具有注释“@Enumerated(EnumType.STRING)” (2认同)