微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – Postgres:如何获取枚举集中的下一项?

考虑使用下面的代码.类型enum_buysell仅包含2个值:买入和卖出.在某些情况下我需要得到相反的值,但代码看起来很难看,imho.有没有办法优化它?我想过根本不使用enum,例如把它改为布尔值,但这个想法并不完美,因为它使数据本身不那么明显.
select
  datetime,case
    when account_id_active  = p_account_id and direction = 'buy'  then 'buy'::enum_buysell
    when account_id_active  = p_account_id and direction = 'sell' then 'sell'::enum_buysell
    when account_id_passive = p_account_id and direction = 'buy'  then 'sell'::enum_buysell
    when account_id_passive = p_account_id and direction = 'sell' then 'buy'::enum_buysell
  end as direction,price,volume
from
  deals
where
  account_id_active  = p_account_id or
  account_id_passive = p_account_id
order by
  datetime desc
limit
  10;
由于在Postgresql中没有获取枚举的下一个值的功能,您应该自己定义它.
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;

现在,您可以像这样使用它:

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

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

并且您的CASE声明变为:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐