Postgresql “的总数”;1s";在Postgres位掩码中

Postgresql “的总数”;1s";在Postgres位掩码中,postgresql,Postgresql,有没有办法获取Postgres“位字符串”类型中1的总数?一位/第一位?还是打开的位的总数?前者:位掩码(&1)位。后者:一个令人讨厌的查询,比如: SELECT (myBit & 1 + myBit >> 1 & 1 + myBit >> 2 & 1) AS bitCount FROM myBitTable; 我想,您也可以强制转换为字符串并在PL/SQL中计算1。您有一种使用plpgsql的简单方法 和无字符串转换的方法: # select

有没有办法获取Postgres“位字符串”类型中1的总数?

一位/第一位?还是打开的位的总数?前者:位掩码(&1)位。后者:一个令人讨厌的查询,比如:

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

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

您有一种使用plpgsql的简单方法

和无字符串转换的方法:

# 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)

如果您需要它真正高效,这里有一个讨论:

我知道,这已经是一个老话题了,但我在这里找到了一个很酷的答案:

这将是:

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

基于这里的讨论,上面提到的线索, 在这个页面上,我发布了一个PostgreSQL扩展:。 如果安装了该扩展(请参见此处的说明),则可以使用以下方法计算位字符串中设置的位数:

# 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'
替换为
'

所打开的总位数快得多。在弦乐上施展似乎毫无效果。我想我可以编写一个函数来处理一系列位(我不知道有足够的PL/SQL来知道是否可以轻松地循环位大小并提取结果)Hmmm。。。看起来位掩码在内部已经是字符串了,所以这个解决方案可能没有看起来那么糟糕。我喜欢字符串替换&长度方法+1@YehudaKatz:链接中的讨论很有趣,但它是关于“第一个位集”和“最后一个位集”,这并没有回答当前的问题。这怎么可能是正确的答案呢?还有nbits_集函数
# 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');