Как выбрать записи, которые имеют определенное значение, если не использовать другое значение в SQL? - PullRequest
0 голосов
/ 13 июля 2020

Я хочу выбрать несколько записей из таблицы, где phone_type = 'PR', если запись не имеет phone_type = 'PR', тогда используйте 'CL'

Table:

ID NAME    Phone_Type Phone_Number
1  Austin  PR         789-100-1000
1  Austin  CL         762-100-1009
1  Austin  PA         789-100-1000
2  Andrew  PR         565-100-1000
2  Andrew  CL         312-199-6754
2  Andrew  FA         602-100-1000
3  Kathy   CL         100-100-1000
3  Kathy   PA         105-109-1002

Результат должен быть таким:

ID NAME    Phone_Type Phone_Number
1  Austin  PR         789-100-1000
2  Andrew  PR         565-100-1000
3  Kathy   CL         100-100-1000

Один из кода SQL, который я пробовал:

select id, name,phone_number_combined,case when phone_type = 'CL' then phone_number_combined end
from telephone where phone_type = 'PR' 

Я не уверен, как добиться этого в SQL, поскольку у меня пробовал операторы CASE, существует и даже пытался объединить таблицу с самим собой.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы должны использовать GROUP BY by и COALESCE:

WITH telephone (id, name, phone_type, phone_number) AS 
  ( SELECT * FROM  (VALUES  
    ( 1,  'Austin', 'PR', '789-100-1000'),
    ( 1,  'Austin', 'CL', '762-100-1009'),
    ( 2,  'Andrew', 'PR', '565-100-1000'),
    ( 2,  'Andrew', 'CL', '312-199-6754'),
    ( 3,  'Kathy' , 'CL', '100-100-1000')  )) 
    
   select 
      id as ID, 
      name as NAME,
      COALESCE( max(case when phone_type = 'PR' then 'PR' end),
                max(case when phone_type = 'CL' then 'CL' end) ) as PHONE_TYPE, 
      COALESCE( max(case when phone_type = 'PR' then phone_number end),
                max(case when phone_type = 'CL' then phone_number end) ) as PHONE_NUMBER
    from telephone 
    group by id, name 
    order by id, name

 ----    
 Results
 ID   NAME      PHONE_TYPE  PHONE_NUMBER
 1    Austin    PR          789-100-1000
 2    Andrew    PR          565-100-1000
 3    Kathy     CL          100-100-1000
0 голосов
/ 13 июля 2020

Используйте функцию row_number .

-- Oracle
with s (id, name, phone_type, phone_number) as ( 
select 1,  'Austin', 'PR', '789-100-1000' from dual union all
select 1,  'Austin', 'CL', '762-100-1009' from dual union all
select 2,  'Andrew', 'PR', '565-100-1000' from dual union all
select 2,  'Andrew', 'CL', '312-199-6754' from dual union all
select 3,  'Kathy' , 'CL', '100-100-1000' from dual)
select  id, name, phone_type, phone_number
from
   (select
    id, name, phone_type, phone_number,
    row_number() over (partition by id order by phone_type desc) rn
    from s
    )
where rn = 1;

        ID NAME   PHONE_TYPE PHONE_NUMBER
---------- ------ ---------- ------------
         1 Austin PR         789-100-1000
         2 Andrew PR         565-100-1000
         3 Kathy  CL         100-100-1000

3 rows selected.
...