PostgreSQL位操作时"can't cast type numeric to bit"错误之解决

前两天编写一个PostgreSQL的函数,其中用到了位(bit)操作,但运行时却报错“can't cast type numeric to bit”。

先略微介绍一下PostgreSQL的位操作,它没有使用内部函数,而是直接使用位操作符(如&, |, !, #等),报错的地方就是用到了&(bit AND):

...
if field_name & 1 >0 then
...

一开始令人很困惑,觉得这符合PostgreSQL的官方解释,不该有错误。而google近来又被封,baidu到的内容没有意义,拖了好一阵。

后来忽然醒悟到错误原因所在,还是习惯性思维所致:原来该field_name在创建表时是按numeric(n, 0)定义的,通常习惯性地认为它是整型,而实际上它属于双精度数。普通的数学运算时PostgreSQL可以将其自动转换为整形,但在位操作时无法将其转换为bit类型,于是报错“can't cast type numeric to bit”。

解决方法是将field_name先转换成整型再使用位操作符:

...
if field_name::integer & 1 >0 then
...
原文地址:https://www.cnblogs.com/wggj/p/8047203.html