Postgresql “的总数”;1s";在Postgres位掩码中
有没有办法获取Postgres“位字符串”类型中1的总数?一位/第一位?还是打开的位的总数?前者:位掩码(&1)位。后者:一个令人讨厌的查询,比如: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
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');