【问题标题】:Count Zero and/or Non-Zero bytes in a bytea/string计数字节茶/字符串中的零和/或非零字节
【发布时间】:2021-12-19 06:50:49
【问题描述】:

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

示例字符串:

0x202ee0ed0000000000000000000000000000000000000000000000000000000000014370000000000000000000000000000000000000000000000000000000003f8affe7

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

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

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

【问题讨论】:

    标签: sql postgresql count bytea


    【解决方案1】:

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

    SELECT cardinality(
              string_to_array(
                 encode('\xDEADF00D0000', 'escape'),
                 '\000'
              )
           ) - 1;
    
     ?column? 
    ══════════
            2
    (1 row)
    

    【讨论】:

    • 您好,谢谢!发布后,我从随机实验中找到了一个类似的答案(data 是我的 bytea 字符串):SELECT COALESCE( (char_length( encode(data,'escape') ) - char_length(REPLACE(encode(data,'escape'),'\000','')) ) /4 ,0) AS zero_bytes 我需要了解更多关于“转义”实际上如何工作以验证它是否正确,但我肯定会看到性能与您的解决方案相比如何。再次感谢!
    • 这也是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多