PostgreSQL: erreur: l'opérateur n'existe pas: entier = variable de caractères

ici, j'essaie de créer une vue comme montré ci-dessous dans l'exemple:

Exemple:

 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 */
 ....;

Note: la même requête exécutée dans sql server mais en obtenant l'erreur ci-dessus dans postgreSQL.

30
demandé sur Meem 2014-05-13 08:47:29

1 réponses

je pense qu'il vous dit exactement ce qui ne va pas. Vous ne pouvez pas comparer un entier avec un varchar. PostgreSQL est strict et ne fait pas de typographie magique pour vous. Je devine que SQLServer fait le typographie automatiquement (ce qui est une mauvaise chose).

si vous voulez comparer ces deux bêtes différentes, vous devrez en lancer une à l'autre en utilisant la syntaxe de casting ::.

quelque Chose le long de ces lignes:

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 */
....;

Notez le varchar typecasting sur la table1.col4.

notez aussi que la typographie pourrait rendre votre index sur cette colonne inutilisable et avoir une pénalité de performance, ce qui est assez mauvais. Une solution encore meilleure serait de voir si vous pouvez changer de façon permanente l'un des deux types de colonne pour correspondre à l'autre. Changez littéralement la conception de votre base de données.

Ou vous pouvez créer un index sur la coulée valeurs à l'aide d'une coutume, d' immuable fonction qui lance les valeurs sur la colonne. Mais cela aussi peut s'avérer sous-optimal (mais meilleur que le casting en direct).

35
répondu Timusan 2016-06-01 00:46:45