Как объединить с различными полями на основе условия - PullRequest
0 голосов
/ 05 ноября 2018

Мне нужно объединить две таблицы door_ctrlr_fact и equip_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 голосов
/ 05 ноября 2018

Я использовал функцию 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') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...