web-dev-qa-db-ja.com

さまざまなタイプで参加する

データベースには2つのテーブルがあります。

  1. 1つ目はintegerであるtaxonomy_idというフィールドがあります
  2. 後者にはcharacter varyingであるIDというフィールドがあります

2つのテーブルは関連しています。最初のテーブルにtaxonomy_id = Nがある行が存在する場合、2番目のテーブルにはID = N.toStringがある行が存在します。

ここで、この2つのテーブル間の結合を行います。当然、タイプが一致しないため、「通常の」結合は機能しません。

これを解決するのを手伝ってくれませんか?

PostgreSQLを使用しています。

5
Aslan986

無効な整数型

フィールドの値がでない場合実際には有効なinteger types(数字と先行-のみ)、JOINのような @ mustaccioを推奨 は例外で失敗します。integerにキャストできませんでした。

それは他の(もっと高価な)方法でなければなりません:

SELECT *
FROM   tbl1 t1
JOIN   tbl2 t2 ON t1.taxonomy_id::varchar = t2.id;

また、@ mustaccioはint8しないでください。integer equals int4int8bigintになります。

これは、関数型インデックスでサポートできます。

CREATE INDEX tbl1_taxonomy_id_idx ON tbl1 (cast(taxonomy_id AS varchar));

有効な整数型

有効なinteger型を扱っている場合は、列がidintegerに変換するだけで済みます-設定でそれが許可されている場合。

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

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のインストールはありません。

0
mustaccio