web-dev-qa-db-fra.com

Joindre sur différents types

Dans une base de données, j'ai deux tables:

  1. Le premier a un champ nommé taxonomy_id c'est un integer
  2. Ce dernier a un champ nommé 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.

5
Aslan986

Types d'entiers non valides

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

Types d'entiers valides

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;
9