Asl*_*986 8 postgresql join datatypes
在数据库中,我有两个表:
taxonomy_id
是一个integer
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
. int8
会bigint
。
您可以使用功能索引来支持它:
CREATE INDEX tbl1_taxonomy_id_idx ON tbl1 (cast(taxonomy_id AS varchar));
Run Code Online (Sandbox Code Playgroud)
如果我们正在处理有效integer
类型,您可以将您的列转换id
为integer
- 如果您的设置允许。
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)
如果这是一项一次性任务,我认为你可以做类似的事情
...
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 安装来验证该示例。
归档时间: |
|
查看次数: |
31329 次 |
最近记录: |