【问题标题】:Sum bytea in postgres在 postgres 中求和 bytea
【发布时间】:2017-01-13 11:15:34
【问题描述】:

我在 postgres 中存储了一个带有类似

的变量的过程
DECLARE 
    totLen  BYTEA;
BEGIN 
     totLen = E'\\x000034';
     ....

totLen 必须正好是 3 个字节,我必须将其他值相加

totLen = totLen + 1;

我尝试 totLen = totLen + E'\x01' 但不起作用。 正确的解决方案是什么?

【问题讨论】:

  • 你想达到什么目的?为什么 PL/pgSQL 变量的长度对您很重要?
  • 这不是重点,但你想知道我正在写 BUFR (en.wikipedia.org/wiki/BUFR) 消息。
  • 问题仍然存在:为什么要关心变量的长度?您不能对 bytea 值进行算术运算。您很可能以更简单的方式实现您想做的事情。如果您愿意分享您正在尝试做的事情的大局。
  • 因为我正在写一些需要使用固定字节长度的东西,所以例如 totLen 必须正好是 3 个字节,并且它是动态构造的,所以我需要用它做算术。如果您有简单的方法,请解释一下,谢谢。
  • 如果您实际上不使用 3 字节算术溢出的方式,那么坚持它是没有意义的。你可以在你的函数中使用int(又名int4,它有4个字节和适当的算术)并在你完成后截断它的值。可能是bit strings

标签: postgresql stored-procedures type-conversion bytea


【解决方案1】:

这是一个函数,它将 byteab 的偏移量 offs 的三个字节视为三字节大端整数并将 i 添加到该数字:

CREATE OR REPLACE FUNCTION add(b bytea, offs integer, i integer) RETURNS bytea
   LANGUAGE plpgsql IMMUTABLE STRICT AS
$$DECLARE
   result integer := get_byte(b, offs) * 65536 +
                     get_byte(b, offs + 1) * 256 +
                     get_byte(b, offs + 2) +
                     i;
BEGIN
   IF result > 16777215 THEN
      RAISE EXCEPTION 'addition overflows';
   END IF;

   RETURN set_byte(
             set_byte(
                set_byte(
                   b,
                   offs,
                   result / 65536
                ),
                offs + 1,
                (result % 65536) / 256
             ),
             offs + 2,
             result % 256
          );
END;$$;

【讨论】:

    猜你喜欢
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2021-04-05
    • 2021-02-24
    相关资源
    最近更新 更多