加入不同类型

Asl*_*986 8 postgresql join datatypes

在数据库中,我有两个表:

  1. 首先有一个名为场taxonomy_id是一个integer
  2. 后者有一个名为场ID是一个character varying

这两个表是相关的:如果它在第一个表中存在一行,那么taxonomy_id = N它就会在第二个表中存在一行ID = N.toString

现在,我想在这两个表之间进行连接;由于类型不匹配,“正常”连接自然不起作用。

你能帮我解决这个问题吗?

我正在使用PostgreSQL.

Erw*_*ter 12

无效的整数类型

如果该字段中的值实际上不是有效integer类型-仅数字和前导),则建议JOIN类似@mustaccio将失败并出现异常:您根本无法强制转换integer为。

它必须是另一种(甚至更贵)的方式:

SELECT *
FROM   tbl1 t1
JOIN   tbl2 t2 ON t1.taxonomy_id::varchar = t2.id;
Run Code Online (Sandbox Code Playgroud)

此外,由于@mustaccio 误导性地建议使用int8不要。 integer等于int4. int8bigint

您可以使用功能索引来支持它:

CREATE INDEX tbl1_taxonomy_id_idx ON tbl1 (cast(taxonomy_id AS varchar));
Run Code Online (Sandbox Code Playgroud)

有效的整数类型

如果我们正在处理有效integer类型,您可以将您的列转换idinteger- 如果您的设置允许。

ALTER TABLE tbl2 ALTER COLUMN id TYPE integer USING id::int;
Run Code Online (Sandbox Code Playgroud)

那么你的问题就消失了:

SELECT *
FROM   tbl1 t1
JOIN   tbl2 t2 ON t1.taxonomy_id = t2.id;
Run Code Online (Sandbox Code Playgroud)

除非(如果由于某种原因无法转换列),功能索引将有所帮助:

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;
Run Code Online (Sandbox Code Playgroud)


mus*_*cio 0

如果这是一项一次性任务,我认为你可以做类似的事情

...
from
 first_table join second_table
  on first_table.taxonomy_id = cast(second_table.id as int8)
...
Run Code Online (Sandbox Code Playgroud)

但是,这可能不会使用 secondary_table.id 上的索引(如果存在),因此性能会受到影响。从长远来看,最好将 secondary_table 中的 id 列转换为正确的 int 数据类型。

免责声明:我没有方便的 Postgres 安装来验证该示例。

  • 将 *“这可能不使用索引”* 更改为 *“这 **将** 不使用索引”* (3认同)
  • ...或者您也可以在 `second_table.id::integer` 上设置索引 (2认同)
  • 这可能*根本不起作用*。我在回答中提供了解释。 (2认同)