Postgres位掩码中的“1”总数

时间:2009-12-15 21:00:32

标签: postgresql

有没有办法在Postgres“bit string”类型中获得1的总数?

6 个答案:

答案 0 :(得分:9)

# select length(replace(x::text, '0', '')) from ( values ('1010111101'::bit varying) ) as something(x);
 length
--------
      7
(1 row)

没有字符串转换的方法:

# select count(*) from ( select x, generate_series(1, length(x)) as i from ( values ('1010111101'::bit varying) ) as something(x) ) as q where substring(x, i, 1) = B'1';
 count
-------
     7
(1 row)

答案 1 :(得分:3)

答案 2 :(得分:1)

我知道,这已经是一个古老的话题,但我在这里找到了一个很酷的答案:https://stackoverflow.com/a/38971017/4420662

所以适应它将是:

=# select length(regexp_replace((B'1010111101')::text, '[^1]', '', 'g'));
 length
--------
      7
(1 row)

答案 3 :(得分:0)

一/一位?或者翻转的总位数?前者:位掩码(& 1)位。后者:一个讨厌的查询,如:

SELECT (myBit & 1 + myBit >> 1 & 1 + myBit >> 2 & 1) AS bitCount FROM myBitTable;

我想,您也可以转换为字符串并计算PL / SQL中的1。

答案 4 :(得分:0)

您可以使用plpgsql here进行简单的方法。

答案 5 :(得分:0)

基于此处的讨论,上面提到的帖子Efficiently determining the number of bits set in the contents of, a VARBIT field, 和Bit Twiddling Hacks页面,我发布了PostgreSQL扩展:pg_bitcount。 如果您安装该扩展(请参阅那里的说明),您可以使用以下方法计算位串中设置的位数:

# Register the extension in PostgreSQL
create extension pg_bitcount;

# Use the pg_bitcount function
select public.pg_bitcount(127::bit(8));
select public.pg_bitcount(B'101010101');

我比较了许多不同的性能算法,并且使用表查找似乎是最快的。它们比转换为文本并将'0'替换为''快得多。