Упростить вложенный случай, когда оператор

Ниже приведен мой текущий оператор SELECT CASE:

SELECT CASE 
WHEN edition = 'STAN' AND has9 = 1 THEN '9'
WHEN edition = 'STAN' AND has8 = 1 THEN '8'
WHEN edition = 'STAN' AND has7 = 1 THEN '7' 
WHEN edition = 'STAN' AND hasOLD = 1 THEN 'OLD'
WHEN edition = 'SUI'  AND has_s9 = 1 THEN 'S9' 
WHEN edition = 'SUI'  AND has_s8 = 1 THEN 'S8' ELSE 'S7' END AS version

Я не всегда хочу повторять условие edition = 'xxx', например

CASE WHEN edition = 'STAN' AND has9 = 1 THEN '9' ELSE WHEN has8 = 1 THEN '8' ELSE WHEN has7 = '7' ELSE WHEN edition 'SUI' AND has_s9 = 1 THEN 'S9' ELSE ...

В Excel это довольно просто, но как я могу скомпилировать это в PostgreSQL?


person coala    schedule 23.05.2014    source источник
comment
Судя по вашему текущему оператору SELECT CASE, вам необходимо пересмотреть свою модель данных. Либо has9, has8, has7 и hasOld являются взаимоисключающими, либо для них существует некоторая иерархия. В обоих случаях вам лучше реструктурировать вашу модель данных.   -  person Patrick    schedule 23.05.2014
comment
Я согласен, это была только сокращенная версия здесь, так как мой приоритет был на вложенном операторе case when. Вы правы, есть какая-то иерархия, полностью это будет выглядеть как SELECT CASE WHEN edition = 'STAN' AND has9 = 1 THEN '9' WHEN edition = 'STAN' AND has9 = 0 AND has8 = 1 Then '8' etc. Это то, что вы имели в виду, Патрик?   -  person coala    schedule 23.05.2014


Ответы (3)


Попробуй это

SELECT CASE 
WHEN edition = 'STAN' THEN 
     CASE 
          WHEN has9 = 1 THEN '9'
          WHEN has8 = 1 THEN '8'
          WHEN has7 = 1 THEN '7'
          WHEN hasOLD = 1 THEN 'OLD'
     END
WHEN edition = 'SUI' THEN
     CASE 
          WHEN has9 = 1 THEN 'S9'
          WHEN has8 = 1 THEN 'S8'
     END
ELSE 'S7' END AS version
person valex    schedule 23.05.2014

Вы можете вложить свой случай, когда.

Кстати, когда делаешь дело на одном поле, можно сделать

case <field> when <value>
             when <otherValue>

скорее тогда

 case when <field> = <value>
      when <field> = <otherValue>

So

case edition
      when 'STAN'
         case when has9 = 1 then '9'
              when has8 = 1 then '8'
              when has7 = 1 then '7'
              when hasOLD = 1 then 'OLD'
         end
     when 'SUI'
         case when has_s9 = 1 then 'S9'
              when has_s8 = 1 then 'S8'
         end
     else 'S7'
end as version
person Raphaël Althaus    schedule 23.05.2014

Postgres поддерживает оба варианта синтаксиса для CASE: «простой СЛУЧАЙ» и «СЛУЧАЙ с поиском». Используйте «простой СЛУЧАЙ». И вы также можете вложить, чтобы смешать оба варианта:

SELECT CASE edition 
       WHEN 'STAN' THEN 
          CASE WHEN has9 = 1 THEN '9'
               WHEN has8 = 1 THEN '8'
               WHEN has7 = 1 THEN '7' 
               WHEN hasOLD = 1 THEN 'OLD'
               -- no ELSE means ELSE NULL
          END
       WHEN 'SUI' THEN
          CASE WHEN has_s9 = 1 THEN 'S9' 
               WHEN has_s8 = 1 THEN 'S8'
          END  -- no ELSE means ELSE NULL
       ELSE 'S7'
       END AS version;

Чтобы сделать этот еще один шаг , вы можете поменять местами константу и переменную. Оба являются просто выражениями и могут меняться местами в Postgres. Может быть, не так легко читать и понимать, но если вам нужен кратчайший код...

SELECT CASE edition 
       WHEN 'STAN' THEN 
          CASE 1
          WHEN has9   THEN '9'
          WHEN has8   THEN '8'
          WHEN has7   THEN '7' 
          WHEN hasOLD THEN 'OLD'
          END
       WHEN 'SUI' THEN
          CASE 1
          WHEN has_s9 THEN 'S9' 
          WHEN has_s8 THEN 'S8'
          END
       ELSE 'S7'
       END AS version;

В стороне: синтаксис для операторов CASE в plpgsql (процедурный язык ) немного отличается. (Разное, правда!)

person Erwin Brandstetter    schedule 24.05.2014