2

我有一个表,其中有一TEXT列包含十六进制数字。我现在需要将它们表示为它们真正的整数,但找不到这样做的方法(类似于to_hex()反向)。

我知道我可以像这样转换文字十六进制值:

SELECT x'DEADBEEF';

但是,如果要转换的值来自列,我该如何应用这样的东西?连接'x'到列名显然不起作用,因为它不再是字符串文字。

我在PostgreSQL 邮件列表中发现了一个非常丑陋的函数,它将一个查询字符串拼凑在一起,这样函数参数又是一个文字,然后执行该函数,但这种方法完全是反常的——必须有一个更好的方式。至少我希望如此,因为这条消息已经有将近十年的历史了……</p>

当然,我知道首先将有问题的值作为整数存储在数据库中是可行的方法。但在这种情况下这是不可能的,所以我一直试图破译这些字符串......)

4

2 回答 2

1

嗯,可能有更简单的方法来做到这一点。

CREATE FUNCTION from_hex(text) RETURNS integer AS $$
DECLARE
    x bytea;
BEGIN
    x := decode($1, 'hex');
    return (get_byte(x, 0) << 24) | (get_byte(x, 1) << 16) |
           (get_byte(x, 2) << 8) | get_byte(x, 3);
END
$$ LANGUAGE plpgsql;

请注意,正如所写,这仅适用于 8 位十六进制数字。

于 2013-01-07T02:45:13.880 回答
1

以下功能与邮件列表中该帖子中的功能大致相同。事实上,我也从邮件列表中获取了它们,但来自较新的帖子。我看不出他们有什么问题。我在迁移一个小数据集时只使用过一次。

如果您可以指出任何可能源自其使用的“反常”,请随意投反对票。

使用INTEGER数据类型:

CREATE OR REPLACE FUNCTION hex_to_int(hexval varchar) RETURNS integer AS $$
DECLARE
  result  int;
BEGIN
EXECUTE 'SELECT x''' || hexval || '''::int' INTO result;
  RETURN result;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;

使用BIGINT数据类型:

CREATE OR REPLACE FUNCTION hex_to_bigint(hexval varchar) RETURNS bigint AS $$
DECLARE
   result  bigint;
BEGIN
EXECUTE 'SELECT x''' || hexval || '''::bigint' INTO result;
 RETURN result;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;
于 2013-01-07T02:58:48.480 回答