Подстановочный знак Teradata в определении соединения - PullRequest
0 голосов
/ 19 февраля 2019

Я присоединился к таблицам, как показано ниже:

select a.*, b.col4, b.col5 from table a
inner join table b
on  a.col2=b.col2
and a.col3=b.col3

Может случиться, что в b.col2 b.col3 может иметь значение '*', которое должно быть чем-то вроде подстановочного знака, означающего, что в этомВ случае, если мы можем присоединить значение b.col2 к любому значению a.col2 или значение b.col3 к любому значению a.col3.

Не могли бы вы помочь мне определить его?

1 Ответ

0 голосов
/ 19 февраля 2019

Похоже, у вас есть значение по умолчанию.Один из методов - многократное сравнение:

select a.*,
       coalesce(b.col4, bdef3.col4, bdef2.col4, bdef.col4) as col4, b.col5
       coalesce(b.col5, bdef3.col5, bdef2.col5, bdef.col5) as col5
from tablea a left join
     tableb b
     on b.col2 = a.col2 and b.col3 = a.col3 left join
     tableb bdef3
     on b.col2 = a.col2 and b.col3 = '*' left join
     tableb bdef2
     on b.col2 = '*' and b.col3 = a.col3 left join
     tableb bdef
     on b.col2 = '*' and b.col3 = '*';

. Возможно, вам понадобится предложение where, если вы хотите гарантировать некоторое совпадение:

where (b.col2 is not null or bdef3.col2 is not null or bdef2.col2 is not null or bdef.col2 is not null)

. Я думаю, что приведенное выше более эффективно, но выможно выразить это более кратко как:

select a.*, b.col4, b.col5
from tablea a left join
     tableb b
     on (b.col2 = a.col2 or b.col2 = '*') and
        (b.col3 = a.col3 or b.col3 = '*')
qualify 1 = row_number() over (partition by a.id order by (case when b.col2 = '*' then 2 else 1 end), (case when b.col3 = '*' then 2, else 1 end))
...