PostgreSQL:将TEXT列视为十六进制数

时间:2013-01-07 02:32:13

标签: postgresql

我有一个包含TEXT列的表,其中包含十六进制数字。 我现在需要将它们表示为它们实际上的整数,但发现没有 这样做的方式(反之类似to_hex())。

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

SELECT x'DEADBEEF';

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

我在PostgreSQL mailing lists找到了一个非常难看的功能 将查询字符串拼凑在一起,使得函数参数再次成为a 文字,然后执行该功能,但方法是彻头彻尾的 不正常的 - 必须有一个更好的方法。至少我希望如此,鉴于此 消息快十年了......

当然,我知道将有问题的值存储为整数 数据库首先是要走的路。但这是不可能的 这种情况,所以我坚持尝试对这些字符串进行decypher ...)

2 个答案:

答案 0 :(得分: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位十六进制数字。

答案 1 :(得分:1)

以下功能与邮件列表中该帖子的功能大致相同。事实上,I took them from the mailing list too,但来自一个较新的帖子。我看不出有什么问题。我在迁移一个小数据集时只使用过一次。

如果你可以指出任何可能源于其使用的“反常”的话,请随意贬低。

使用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;