web-dev-qa-db-fra.com

PostgreSQL: ERREUR: l'opérateur n'existe pas: entier = caractère variable

Ici, j'essaie de créer une vue comme indiqué 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 */
 ....;

Remarque: La même requête est exécutée sur le serveur SQL mais génère l'erreur ci-dessus dans postgreSQL.

46
Meem

Je pense que cela 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 conversion magique pour vous. J'imagine que SQLServer transforme la typographie automatiquement (ce qui est une mauvaise chose).

Si vous voulez comparer ces deux bêtes différentes, il vous faudra lancer l'un sur l'autre en utilisant la syntaxe de casting ::.

Quelque chose dans ce sens:

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 également que la transtypage peut rendre votre index sur cette colonne inutilisable et entraîner une pénalité de performances, ce qui est plutôt grave. Une solution encore meilleure serait de voir si vous pouvez modifier en permanence l'un des deux types de colonne pour qu'il corresponde à l'autre. Changez littéralement la conception de votre base de données.

Vous pouvez également créer un index sur les valeurs converties en utilisant une fonction personnalisée, immuable, qui convertit les valeurs dans la colonne. Mais cela aussi peut s'avérer sous-optimal (mais meilleur que la diffusion en direct).

51
Timusan