Not valid integer types
If the values in the field are not actually valid integer
types (digits and leading -
only), a JOIN
like @mustaccio suggested would fail with an exception: you couldn't cast to integer
at all.
It would have to be the other (even more expensive) way round:
SELECT *
FROM tbl1 t1
JOIN tbl2 t2 ON t1.taxonomy_id::varchar = t2.id;
Also, since @mustaccio misleadingly suggested to use int8
: Don't. integer
equals int4
. int8
would be bigint
.
You can support that with a functional index:
CREATE INDEX tbl1_taxonomy_id_idx ON tbl1 (cast(taxonomy_id AS varchar));
Valid integer types
If we are dealing with valid integer
types, you could just convert your column id
to integer
- if your setup allows that.
ALTER TABLE tbl2 ALTER COLUMN id TYPE integer USING id::int;
Then your problem is gone for good:
SELECT *
FROM tbl1 t1
JOIN tbl2 t2 ON t1.taxonomy_id = t2.id;
Barring that (if you cannot convert the column for some reason), a functional index would help:
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;