有没有办法在Postgres“bit string”类型中获得1的总数?
答案 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'
替换为''
快得多。