2015-04-29 16 views
6

Considerare di utilizzare il codice qui sotto. Digitare enum_buysell include solo 2 valori: buy e sell. Ho bisogno di ottenere il valore opposto in alcuni casi, ma il codice sembra brutto, imho. C'è un modo per ottimizzarlo? Ho pensato di non usare affatto enum, ad es. rendilo invece booleano, ma questa idea non è perfetta in quanto rende i dati stessi meno ovvi.Postgres: come ottenere l'elemento successivo in un set enum?

+0

Logic: un enum è fondamentalmente * * non ordinata. – wildplasser

+0

@wildplasser, fondamentalmente hai decisamente ragione, ma questo non è vero per Postgres, - dai un'occhiata a [docs: 8.7.2. Ordinamento] (http://www.postgresql.org/docs/9.4/static/datatype-enum.html) –

risposta

3

Poiché non c'è alcuna funzione per ottenere il valore successivo di enum in PostgreSQL, è necessario definirlo manualmente.

create function next_buysell (e enum_buysell) 
returns enum_buysell 
as $$ 
begin 
    return (case when e='buy'::enum_buysell then 'sell'::enum_buysell 
       else 'buy'::enum_buysell 
      end); 
end 
$$ language plpgsql; 

Ora, è possibile utilizzarlo in questo modo:

postgres=# select next_buysell('sell'::enum_buysell); 
next_buysell 
-------------- 
buy 
(1 row) 

postgres=# select next_buysell('buy'::enum_buysell); 
next_buysell 
-------------- 
sell 
(1 row) 

E la sua dichiarazione CASE diventa: problema

case 
    when account_id_active = p_account_id then direction 
    when account_id_passive = p_account_id then next_buysell(direction) 
end as direction 
+0

grazie, sembra migliore, questo è certo, ma non c'è qualche svantaggio di prestazioni relativo all'esecuzione di un'altra funzione, che fondamentalmente fa la stessa cosa del codice inline stesso? Voglio dire, questi tipi casuali di cast da 'varchar' a' enum_buysell' sono ancora lì, sono davvero impossibili da evitare? –

Problemi correlati