Dans une base de données, j'ai deux tables:
taxonomy_id
c'est un integer
ID
qui est un character varying
Les deux tables sont liées: si elle existe une ligne dans la première avec taxonomy_id = N
Il existera une rangée dans le second avec ID = N.toString
.
Maintenant, j'aimerais faire la jointure entre ces deux tables; Naturellement, la jointure "normale" ne fonctionne pas en raison de la décalage de type.
Pouvez-vous m'aider à résoudre ce problème?
J'utilise PostgreSQL
.
Si les valeurs du champ sont non En réalité valide integer
Types (chiffres et menant -
uniquement), un JOIN
comme @ Mustaccio suggéré échouerait avec une exception: vous ne pouviez pas vous lancer sur integer
du tout.
Il faudrait que ce soit l'autre (encore plus cher) du chemin:
SELECT *
FROM tbl1 t1
JOIN tbl2 t2 ON t1.taxonomy_id::varchar = t2.id;
En outre, étant donné @mustaccio suggéré mal à utiliser int8
: Neinteger
est égal à int4
. int8
serait bigint
.
Vous pouvez supporter cela avec un indice fonctionnel:
CREATE INDEX tbl1_taxonomy_id_idx ON tbl1 (cast(taxonomy_id AS varchar));
Si nous traitons avec des types valides integer
, vous pouvez simplement convertir votre colonne id
_ à integer
- si votre configuration le permet.
ALTER TABLE tbl2 ALTER COLUMN id TYPE integer USING id::int;
Ensuite, votre problème est parti pour bon:
SELECT *
FROM tbl1 t1
JOIN tbl2 t2 ON t1.taxonomy_id = t2.id;
Sauf que (si vous ne pouvez pas convertir la colonne pour une raison quelconque), un indice fonctionnel aiderait:
CREATE INDEX tbl2_id_idx ON tbl2 (cast(id AS int));
SELECT *
FROM tbl1 t1
JOIN tbl2 t2 ON t1.taxonomy_id = t2.id::int;