PostgreSQL如何对数据类型不同的列执行两表关联操作
问题核心原因
你当前的报错和关联失效有两个核心原因:
- 关联时直接将varchar类型的
metric_type_id与bigint类型的function_id进行匹配,metric_type_id中的非数字值会触发类型转换异常 - 你代码中写的CASE转换得到的
id_m字段,并没有实际用到关联逻辑中
推荐解决方案
优先选择将function_id转为文本进行匹配的方案,不需要额外做正则校验和类型转换,性能更高且不会触发转换报错:
SELECT lin.metric_name, lin.metric_type, lin.metric_value, func.function_name FROM "LIN_Main_Followers" lin LEFT JOIN "LIN_MD_Functions" func ON lin.metric_type = 'function' -- 仅让function类型的行参与关联 AND lin.metric_type_id = func.function_id::text -- 把bigint类型的function_id转为文本,和varchar的metric_type_id匹配 WHERE lin.metric_type = 'function'; -- 若只需要返回function类型的结果,增加该行过滤即可
如果你确实需要将metric_type_id转为数值类型再关联,可以使用如下写法,先通过正则校验确保是纯数字后再做类型转换:
SELECT lin.metric_name, lin.metric_type, lin.metric_value, func.function_name FROM "LIN_Main_Followers" lin LEFT JOIN "LIN_MD_Functions" func ON lin.metric_type = 'function' AND lin.metric_type_id ~ '^\d+$' -- 仅匹配纯数字的metric_type_id AND lin.metric_type_id::integer = func.function_id WHERE lin.metric_type = 'function';
两种写法执行后都会得到你需要的预期结果。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

