2016-05-04 7 views
0

Я пытаюсь переписать некоторые старые SQL-запросы, которые выглядят особенно ужасно. Мне интересно, существует ли более эффективный способ определения приоритетов значений в инструкции where для порядка приоритета. В основном таблица содержит несколько записей электронной почты для каждого пользователя, но я хочу расставить приоритеты на основании того, какие записи предпочтительнее. В этом случае, если email_code - WORK, он должен быть выбран. Но если нет записи WORK, следует выбрать HOME, и так далее. Вот пример того, с чем я работаю. Должен быть более изящный способ сделать это ...?выбор oracle на основе приоритета

select 
    * 
from 
    email m 
where 
    status_ind='A' 
    and decode(email_code, 'WORK',1, 
          'HOME',2, 
          'ALT1',3, 
          'ALT2',4,5) = (select 
              min(decode(email_code, 'WORK',1, 
                   'HOME',2, 
                   'ALT1',3, 
                   'ALT2',4,5)) 
             from 
              email 
             where 
              email_uid = m.email_uid 
              and status_ind='A'); 
+0

Вы имеете в виду COALESCE? https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm – Danilo

+0

Я не думаю, что COALESCE работает в этой ситуации. В некоторых случаях запись может содержать все 4 из этих кодов. Его больше о порядке приоритетности. – oljones

ответ

1

Try:

SELECT * FROM (
    SELECT e.*, 
      dense_rank() over (PARTITION BY user_id 
      ORDER BY CASE email_code 
       WHEN 'WORK' THEN 1 
       WHEN 'HOME' THEN 2 
       WHEN 'ALT1' THEN 3 
       WHEN 'ALT2' THEN 4 
       ELSE 5 
      END) As priority 
    FROM emails e 
    WHERE status_ind='A' 
) 
WHERE priority = 1 
+0

Это работало лучше всего для моей ситуации. Благодаря! – oljones

0

Увы, я не имел Oracle здесь, но я думаю, что вы можете использовать что-то вроде этого

select * from (
    select *,min(decode(email_code, 'WORK',1, 
     'HOME',2,'ALT1',3,'ALT2',4,5)) mincode 
     over(partition by (email_uid)) 
    where status_ind='A' 
) where email_code=mincode 
0

Прежде всего, она должна быть лучше, чтобы создать поиск таблицы для хранения типов электронной почты и их приоритетов. И затем вы можете присоединиться к этой таблице поиска со своей почтовой таблицей. Наконец, можно использовать одну из аналитических функций Oracle (row_number, rank, dense_rank и т. Д.), Чтобы получить наивысший приоритет.