在 bytea/string 中计数零 and/or 个非零字节

Count Zero and/or Non-Zero bytes in a bytea/string

我有一个 bytea 格式的字段,我正在尝试计算该字段中有多少个零字节 (postgresql)。

示例字符串:

0x202ee0ed0000000000000000000000000000000000000000000000000000000000014370000000000000000000000000000000000000000000000000000000003f8affe7

我最初尝试通过计算 00 发生的频率来做到这一点,但这可能不准确,因为它不检查它是一个字节还是恰好彼此相邻的两个 0。

我目前正在使用这个 regex_replace(从另一个问题中找到)在字节之间强制使用 _,这样我就可以计算 00 的出现次数,但这会减慢速度多个量级的查询与 100k-1m+ 行的简单 replace 的查询: regexp_replace(data::text, '(..)', E'\1_', 'g') - 生成类似 20_2e_e0...

的内容

我想知道是否有人知道一种更高效的方法来计算 bytea/string 中零或非零字节的数量?

我认为SQL中没有非常简单有效的方法。我能想到的最好的是:

SELECT cardinality(
          string_to_array(
             encode('\xDEADF00D0000', 'escape'),
             '[=10=]0'
          )
       ) - 1;

 ?column? 
══════════
        2
(1 row)