Можем ли мы использовать Case Когда создан столбец в состоянии соединения при объединении таблиц - PullRequest
0 голосов
/ 15 марта 2019

Если мы используем регистр при создании столбца в условии соединения ... код запускается.Но правильно ли это?Если это так, как это выполняется?

select *,
case when position('/' in pax_name)>0 
         then SUBSTR(pax_name, 1, position('/' in pax_name)- 1) 
          end as **lastname**, 
    CASE WHEN position('/' in pax_name)>0 
         THEN SUBSTR(pax_name, position('/' in pax_name) + 1, LENGTH(pax_name))  
         END as **firstname**
from o
inner join m
on o.record=m.record
and o.pax_first_name = **firstname**
and o.pax_last_name = **lastname**

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

использовать подзапрос

select o1.* from (
select *,
case when position('/' in pax_name)>0 
         then SUBSTR(pax_name, 1, position('/' in pax_name)- 1) 
          end as **lastname**, 
    CASE WHEN position('/' in pax_name)>0 
         THEN SUBSTR(pax_name, position('/' in pax_name) + 1, LENGTH(pax_name))  
         END as firstname
from o
) o1 inner join m
on o1.record=m.record
and o1.pax_first_name = firstname
and o1.pax_last_name =lastname 
0 голосов
/ 15 марта 2019

Псевдонимы столбцов, определенные в select, недоступны в большинстве запросов на том же уровне select. В частности, они недоступны для предложений where или from.

Вы можете сделать это, используя having:

select *,
       (case when position('/' in pax_name) > 0 
             then SUBSTR(pax_name, 1, position('/' in pax_name)- 1) 
        end) as lastname, 
       (case when position('/' in pax_name)  >0 
             then substr(pax_name, position('/' in pax_name) + 1, length(pax_name))  
        end) as firstname
from o inner join
     m
     on o.record = m.record
having o.pax_first_name = firstname and
       o.pax_last_name = lastname;

Вы можете упростить логику. Я думаю, что вы просто хотите:

select *,
       (case when pax_name like '%'
             then substring_index(pax_name, '/', 1)
        end) as firstname,
       (case when pax_name like '%'
             then substring_index(pax_name, '/', -1)
        end) as lastname
from o inner join
     m
     on o.record = m.record
having o.pax_first_name = firstname and
       o.pax_last_name = lastname;

Я бы также рекомендовал отказаться от наличия, так что:

select *,
       (case when pax_name like '%'
             then substring_index(pax_name, '/', 1)
        end) as firstname,
       (case when pax_name like '%'
             then substring_index(pax_name, '/', -1)
        end) as lastname
from o inner join
     m
     on o.record = m.record
        m.pax_name = concat_ws('/', o.pax_first_name, o.pax_last_name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...