Общее количество «1» в битовой маске Postgres - PullRequest
8 голосов
/ 16 декабря 2009

Есть ли способ получить общее количество единиц в типе "битовой строки" Postgres?

Ответы [ 6 ]

9 голосов
/ 16 декабря 2009
# 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)
3 голосов
/ 16 декабря 2009

Если вам нужно, чтобы он был действительно эффективным, вот обсуждение: Эффективное определение количества бит, установленных в содержимом поля VARBIT

1 голос
/ 05 января 2017

Я знаю, это уже старая тема, но я нашел здесь крутой ответ: https://stackoverflow.com/a/38971017/4420662

Так адаптировано это будет:

=# select length(regexp_replace((B'1010111101')::text, '[^1]', '', 'g'));
 length
--------
      7
(1 row)
0 голосов
/ 30 марта 2018

Основываясь на обсуждении, упомянутом выше, поток Эффективно определяет количество битов, установленных в содержимом поля VARBIT , и на странице 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' на ''.

0 голосов
/ 16 декабря 2009

У вас есть простой способ, используя plpgsql здесь .

0 голосов
/ 16 декабря 2009

Один / первый бит? Или общее количество битов включено? Первый: битовая маска (& 1) бит. Последний: неприятный запрос, как:

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

Полагаю, вы также можете привести к строке и считать 1 в PL / SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...