PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

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

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 typage magique pour vous. Je suppose que SQLServer effectue automatiquement le transtypage (ce qui est une mauvaise chose).

Si vous voulez comparer ces deux bêtes différentes, vous devrez les convertir l'une à l'autre en utilisant la syntaxe de conversion :: .

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

Remarquez le varchar transtypage sur la table1.col4.

Notez également que le transtypage peut éventuellement rendre votre index sur cette colonne inutilisable et a une pénalité de performance, ce qui est plutôt mauvais. Une solution encore meilleure serait de voir si vous pouvez modifier de façon permanente l'un des deux types de colonne pour qu'il corresponde à l'autre. Modifiez littéralement la conception de votre base de données.

Ou vous pouvez créer un index sur les valeurs castées en utilisant un immuable personnalisé fonction qui projette les valeurs sur la colonne. Mais cela aussi peut s'avérer sous-optimal (mais mieux que la diffusion en direct).