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.
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).