如何根据条件加入不同领域

时间:2018-11-05 15:56:09

标签: sql postgresql join

我需要在查询中联接两个表door_ctrlr_factequip_store_dim

select * from door_ctrlr_fact d
join equip_store_dim e
on d.door_id = e.tech_nbr

有一小组带有特殊door_id的数据,例如WM1-1003-072。该字符串的第三个字段前导零,需要在加入前将其删除。因此,该数据子集的查询为:

select * from door_ctrlr_fact d
join equip_store_dim e
on split_part(d.door_id, '-', 1) = split_part(e.tech_nbr, '-', 1)
and split_part(d.door_id, '-', 2) = split_part(e.tech_nbr, '-', 2)
and trim(leading '0' from split_part(e.door_id, '-', 3)) = trim(leading '0' from split_part(e.tech_nbr, '-', 3))
where door_id like 'WM%'

为了处理所有情况,我可以根据door_id的外观来合并两个查询。

例如,在表door_ctrlr_fact中:

door_id       cycle_cnt
A10003        500
WM4-103-070   1000
B200384       2000

在表equip_store_dim

tech_nbr       store_id
A10003         S001
WM4-103-70    S002
B200384        S004

加入后,结果应为:

door_id      cycle_cnt       store_id
A10004        500             S001
WM4-103-70    1000            S002
B200384       2000            S004

我想知道是否还有更好的方法。我可以只使用一个查询并根据door_id

的不同格式以不同的方式联接字段

1 个答案:

答案 0 :(得分:2)

我使用了REGEXP_REPLACE函数来修改联接中的door_id,我使用了正则表达式中的组来仅匹配第二个连字符后的'-0'组合

SELECT door_id, cycle_cnt, store_id
FROM door_ctrlr_fact
JOIN equip_store_dim ON tech_nbr = REGEXP_REPLACE(door_id, '(.*-.*)(-0)(.*)', '\1-\3')