gpt4 book ai didi

sql - 如何在postgresql中将位变化转换为数字

转载 作者:行者123 更新时间:2023-11-29 12:49:31 24 4
gpt4 key购买 nike

我正在尝试将 bit varying 转换为 postgresql 中的 numeric(十进制值)

select cast('10110101110110010100110001101010100111011011010000000101'::bit varying as numeric);

我已尝试使用 cast 函数,但出现以下错误。

ERROR: cannot cast type bit varying to numeric LINE 1: select cast('10110101110110010100110001101010100111011011010... ^ ********** Error **********

ERROR: cannot cast type bit varying to numeric SQL state: 42846 Character: 8

输出应为:5429503678976。有什么建议

编辑:我不知道最大值所以不能使用

select b'10110101110110010100110001101010100111011011010000000101'::bigint

谢谢

最佳答案

您可以将它分解成单独的位,将它们转换为适当的数值,然后将它们相加:

with data(d) as (VALUES (B'10110101110110010100110001101010100111011011010000000101') )
select sum(parts) FROM (
SELECT get_bit(d, length(d) - n)::numeric * pow(2::numeric, n-1) as parts
from data, generate_series(1, length(d), 1) g(n)
) sub
;
sum
------------------------------------
51185893014090757.0000000000000000
(1 row)

请注意,这给了我与 select b'10110101110110010100110001101010100111011011010000000101'::bigint; 相同的答案,但它也适用于更大的值,其中 bigint 将超出范围。

你可以把它变成一个函数:

CREATE OR REPLACE FUNCTION bitstring_to_numeric(l_bit_string varbit) 
RETURNS numeric AS $$
SELECT sum(parts) FROM (
SELECT get_bit(l_bit_string,
length(l_bit_string) - n)::numeric * pow(2::numeric, n-1) as parts
from generate_series(1, length(l_bit_string), 1) g(n)
) sub
$$ LANGUAGE SQL
IMMUTABLE;

select bitstring_to_numeric(B'10110101110110010100110001101010100111011011010000000101');
bitstring_to_numeric
------------------------------------
51185893014090757.0000000000000000

关于sql - 如何在postgresql中将位变化转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57691564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com