データベースには2つのテーブルがあります。
integer
であるtaxonomy_id
というフィールドがありますcharacter varying
であるID
というフィールドがあります2つのテーブルは関連しています。最初のテーブルにtaxonomy_id = N
がある行が存在する場合、2番目のテーブルにはID = N.toString
がある行が存在します。
ここで、この2つのテーブル間の結合を行います。当然、タイプが一致しないため、「通常の」結合は機能しません。
これを解決するのを手伝ってくれませんか?
PostgreSQL
を使用しています。
フィールドの値がでない場合実際には有効なinteger
types(数字と先行-
のみ)、JOIN
のような @ mustaccioを推奨 は例外で失敗します。integer
にキャストできませんでした。
それは他の(もっと高価な)方法でなければなりません:
SELECT *
FROM tbl1 t1
JOIN tbl2 t2 ON t1.taxonomy_id::varchar = t2.id;
また、@ mustaccioはint8
:しないでください。integer
equals int4
。 int8
はbigint
になります。
これは、関数型インデックスでサポートできます。
CREATE INDEX tbl1_taxonomy_id_idx ON tbl1 (cast(taxonomy_id AS varchar));
有効なinteger
型を扱っている場合は、列がid
をinteger
に変換するだけで済みます-設定でそれが許可されている場合。
ALTER TABLE tbl2 ALTER COLUMN id TYPE integer USING id::int;
その後、あなたの問題は完全に消えました:
SELECT *
FROM tbl1 t1
JOIN tbl2 t2 ON t1.taxonomy_id = t2.id;
それがなければ(何らかの理由で列を変換できない場合)、関数型インデックスが役立ちます。
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;
1回限りのタスクであれば、次のようなことができると思います
...
from
first_table join second_table
on first_table.taxonomy_id = cast(second_table.id as int8)
...
ただし、second_table.idのインデックスが存在する場合、これを使用しない場合があるため、パフォーマンスが低下します。長期的には、second_tableのid列を適切なintデータ型に変換した方がよいでしょう。
免責事項:この例を確認するのに便利なPostgresのインストールはありません。