首页 > 解决方案 > 如何使用解析功能运行连接?

问题描述

我有 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 个不同的模式)相等。

  1. 我该怎么做 ?
  2. 如何join在字段的 2 个表之间运行id并使用我自己的 id 解析器?

标签: postgresql

解决方案


正确的解决方案是规范化您的数据模型并使用正确的数据类型将该单列转换为多列。

在此之前,您可以通过拆分连接条件中的值来解决此设计错误:

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

推荐阅读