postgresql - 如何使用解析功能运行连接?
问题描述
我有 2 张桌子:
表一:
name - text
id - text
id pattern: xx_yyyy_AAA (xx, yyyy contains digits, AAA contains letters)
表 B:
name - text
id - text
id pattern: yyyy_xx_zz_tt (xx, yyyy, zz, tt contains digits)
我想在id
字段上的 2 个表之间运行连接并使用我自己的id
字段解析器
即有一些规则使 2 id's
(2 个不同的模式)相等。
- 我该怎么做 ?
- 如何
join
在字段的 2 个表之间运行id
并使用我自己的 id 解析器?
解决方案
正确的解决方案是规范化您的数据模型并使用正确的数据类型将该单列转换为多列。
在此之前,您可以通过拆分连接条件中的值来解决此设计错误:
select *
from table_a a
join table_b b
on split_part(a.id, '_', 1) = split_part(b.id, '_', 2)
and split_part(a.id, '_', 2) = split_part(b.id, '_', 1)
如果你愿意,你可以把它变成一个函数:
create function match_badly_designed_ids(p_id_one text, p_id_two text)
returns boolean
as
$$
select split_part(p_id_one, '_', 1) = split_part(p_id_two, '_', 2)
and split_part(p_id_one, '_', 2) = split_part(p_id_one, '_', 1);
$$
language sql
immutable;
然后你可以在这样的 JOIN 子句中使用它:
select *
from table_a a
join table_b b on match_badly_designed_ids(a.id, b.id);
推荐阅读
- r - 如何编写一个for循环来计算R中数据集每列的最大值?
- mysql - 使用mysql选择随机记录
- rest - Peoplesoft 集成代理 REST 服务 POST - 如何在 Peoplesoft 中设置
- c - 如何让 C 中的标准输入从另一个程序中读取外部数据?
- android - android-sdk 工具上的标签不匹配太多,无法构建 docker 映像
- sql - 用于检查特定日期格式的 SQL Case 语句
- azure - 来自特定网站的必应新闻搜索结果
- python - 如何将小时数添加到数据框中的原始时间然后生成新日期?
- sql - SQL 问题:如何找到始终映射到另一个表中的“真实”字段的 ID 计数
- c# - 输入字符串的格式不正确?