我有一个包含TEXT
列的表,其中包含十六进制数字。
我现在需要将它们表示为它们实际上的整数,但发现没有
这样做的方式(反之类似to_hex()
)。
我知道我可以像这样转换 literal 十六进制值:
SELECT x'DEADBEEF';
但是如果要转换的值来自a,我该如何应用这样的东西
柱?将'x'
连接到列名称显然不起作用,因为那样
它不再是字符串文字。
我在PostgreSQL mailing lists找到了一个非常难看的功能 将查询字符串拼凑在一起,使得函数参数再次成为a 文字,然后执行该功能,但方法是彻头彻尾的 不正常的 - 必须有一个更好的方法。至少我希望如此,鉴于此 消息快十年了......
当然,我知道将有问题的值存储为整数 数据库首先是要走的路。但这是不可能的 这种情况,所以我坚持尝试对这些字符串进行decypher ...)
答案 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;