2015-02-20 2 views
0

Для удобства чтения я хотел бы изменить приведенный ниже оператор. Есть ли способ извлечь оператор CASE, поэтому я могу использовать его несколько раз, не выписывая его каждый раз?Упрощение выражения CASE, используемого несколько раз

select 
     mturk_worker.notes, 
     worker_id, 
     count(worker_id) answers, 
     count(episode_has_accepted_imdb_url) scored, 
     sum(case when isnull(imdb_url) and isnull(accepted_imdb_url) then 1 
       when imdb_url = accepted_imdb_url then 1 
       else 0 end) correct, 
     100 * (sum(case when isnull(imdb_url) and isnull(accepted_imdb_url) then 1 
         when imdb_url = accepted_imdb_url then 1 
         else 0 end) 
      /count(episode_has_accepted_imdb_url) ) percentage 
    from 
     mturk_completion 
     inner join mturk_worker using (worker_id) 
    where 
     timestamp > '2015-02-01' 
    group by 
     worker_id 
    order by 
     percentage desc, 
     correct desc 
+0

Для этого используйте tsql. – Rigel1121

ответ

1

Фактически вы можете удалить заявления case. MySQL интерпретирует логические выражения в виде целых чисел в числовом контексте (с 1 и правдивыми 0 ложными):

select mturk_worker.notes, worker_id, count(worker_id) answers, 
     count(episode_has_accepted_imdb_url) scored, 
     sum(imdb_url = accepted_imdb_url or imdb_url is null and accepted_idb_url is null) as correct, 
     (100 * sum(imdb_url = accepted_imdb_url or imdb_url is null and accepted_idb_url is null)/count(episode_has_accepted_imdb_url) 
     ) as percentage 
from mturk_completion inner join 
    mturk_worker 
    using (worker_id) 
where timestamp > '2015-02-01' 
group by worker_id 
order by percentage desc, correct desc; 

Если вы хотите, вы можете упростить его дальше с помощью оператора нуля-сейфа равен:

select mturk_worker.notes, worker_id, count(worker_id) answers, 
     count(episode_has_accepted_imdb_url) scored, 
     sum(imdb_url <=> accepted_imdb_url) as correct, 
     (100 * sum(imdb_url <=> accepted_imdb_url)/count(episode_has_accepted_imdb_url) 
     ) as percentage 
from mturk_completion inner join 
    mturk_worker 
    using (worker_id) 
where timestamp > '2015-02-01' 
group by worker_id 
order by percentage desc, correct desc; 

Это не стандартный SQL, но он отлично подходит для MySQL.

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

+0

Я думаю, причина, по которой я использовал случай, - убедиться, что «NULL = NULL». Пройдет ли вторая часть вашего ответа? – Hockey127

+0

@ Hockey127. , , Да, в MySQL '<=>' является оператором сравнения «нуль-безопасный». Итак, если оба значения равны «NULL», тогда он возвращает true. –

Смежные вопросы