在 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)
我有一个 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)