Перевод DECODE в Postgres - PullRequest
       7

Перевод DECODE в Postgres

0 голосов
/ 01 октября 2019

Как я могу перевести выражение DECODE в Postgres?

MAX(DECODE(r.name,'AREA_SEC_TRANVERSAL',r.value,NULL)) AREA

Я нашел следующий тип, но я не знал, как "MAX" может соответствовать в этом случае.

CASE search-expression
    WHEN expression [, expression [ ... ]] THEN
      statements
  [ WHEN expression [, expression [ ... ]] THEN
      statements
    ... ]
  [ ELSE
      statements ]
END CASE;

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Обычный перевод будет использовать case выражение:

MAX(CASE WHEN r.name = 'AREA_SEC_TRANVERSAL' THEN r.value END) as AREA

Фактически, общая замена для DECODE() - CASE, который является стандартом SQL для условной логики - я бырекомендуется CASE даже в базах данных, которые поддерживают DECODE().

Однако Postgres поддерживает оператор standard SQL filter. Я бы порекомендовал использовать это вместо этого:

MAX(r.value) FILTER (WHERE r.name = 'AREA_SEC_TRANVERSAL') as AREA

Мне легче за этим следить (возможно, теперь, когда я к этому привык). Более того, он дает оптимизатору лучшие возможности для повышения производительности.

2 голосов
/ 01 октября 2019

Вы можете оставить максимум как есть:

MAX(CASE 
      WHEN r.name = 'AREA_SEC_TRANVERSAL'
      THEN r.value
    END) AREA

или

MAX(CASE r.name 
      WHEN 'AREA_SEC_TRANVERSAL'
      THEN r.value
      ELSE null
    END) AREA
...