Postgres动态设置位大小

时间:2014-06-01 08:16:19

标签: stored-procedures bit postgresql-9.3

目标是在位置N快速提取位; 到目前为止,我只发现了这种方式:

CREATE OR REPLACE FUNCTION test(x int, size int)
RETURNS int AS
$BODY$
DECLARE
y int;

BEGIN
    y = get_bit(x::bit(size)>>size-1,size-1);


    return y;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

但这是因为位(大小)

  

整数的输入语法无效:" size"

所以我希望将大小写为常量,例如 bit(3)

有没有办法动态设置位大小?或者,也许有一些其他方法可以提取int / text的特定位?

1 个答案:

答案 0 :(得分:1)

你不需要比特字段类型。要测试值200的第6位:

SELECT 200 & (1<<6) != 0

你二进制 - 和一个设置了第6位的值,通过将1乘以6个base-2位置,然后测试结果是否为非零。

或者,根据整数强制转换为合适的位大小并使用position,但我认为当你可以使用极快的按位AND和上面的移位时,没有任何理由这样做。因为左边有get_bit个数字,并且使用1偏移而不是0偏移,所以你必须得到31(对于32位int)的赞美来从右边获取位置:

SELECT get_bit(200::bit(32), 31 - 6);

所以方式更简单,只需像第一个例子一样使用按位操作。