PostgreSQL:将非常大的数字的十六进制字符串转换为NUMERIC

2023-11-22

我正在尝试转换非常大的数字的十六进制字符串 到数字列

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

我正在尝试这样做:

select hex_to_int(tx.value) from internal_transaction tx

我得到的错误是:

[42846] ERROR: cannot cast type bit to numeric Where: PL/pgSQL function hex_to_int(character varying) line 5 at EXECUTE statement

还有一个转换函数。这个想法是减少循环中的步骤数,从而减少算术运算的数量。

create or replace function hex_to_numeric(str text)
returns numeric 
language plpgsql immutable strict as $$
declare
    i int;
    n int = length(str)/ 8;
    res dec = 0;
begin
    str := lpad($1, (n+ 1)* 8, '0');
    for i in 0..n loop
        res:= res * 4294967296; -- hex 100000000
        res:= res + concat('x', substr(str, i* 8+ 1, 8))::bit(32)::bigint::dec;
    end loop;
    return res;
end $$;

一些测试:

select hex, hex_to_numeric(hex) 
from   (
   values ('ff'::text),
        ('7fffffff'),
        ('80000000'),
        ('deadbeef'),
        ('7fffffffffffffff'),
        ('8000000000000000'),
        ('ffffffffffffffff'),
        ('ffffffffffffffff123'),
        ('4540a085e7334d6494dd6a7378c579f6')
   ) t(hex);
   
               hex                |             hex_to_numeric             
----------------------------------+----------------------------------------
 ff                               |                                    255
 7fffffff                         |                             2147483647
 80000000                         |                             2147483648
 deadbeef                         |                             3735928559
 7fffffffffffffff                 |                    9223372036854775807
 8000000000000000                 |                    9223372036854775808
 ffffffffffffffff                 |                   18446744073709551615
 ffffffffffffffff123              |                75557863725914323415331
 4540a085e7334d6494dd6a7378c579f6 | 92052294502540680826164862654582454774
(9 rows)

该函数比其他答案中的 plpgsql 函数快 5-10 倍(取决于十六进制值的长度)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL:将非常大的数字的十六进制字符串转换为NUMERIC 的相关文章

随机推荐

  • 如何在 Ag-Grid 中隐藏排序顺序指示器?

    我正在使用 AgGrid 和 ag grid angular 15 0 0 我的所有专栏都是可排序的 Ag grid 在每个标题中打印一个数字 指示排序顺序 如何隐藏这个 我正在使用suppressMultiSort true 因为我只想按
  • Rails 使用 Twitter Bootstrap 设计 I18n Flash 消息

    你好 我是 Ruby on Rails 的新手 我正在努力理解 I18n 的 Flash 消息 我正在使用 devise rails 4 和 twitter bootstrap 我知道 devise 仅使用flash notice and
  • Swift 4 计时器因 NSException 崩溃

    我一直在寻找一种在 Swift 4 中使用计时器的方法 并查看了this文章 我在 xcode 中测试了我的代码 当计时器第一次计时 在本例中是 10 秒后 时 应用程序崩溃并收到错误 尽管构建成功 2017 11 20 19 54 42
  • 扩展设备注册控制器

    我有一个Accounts使用 Devise 设置模型 Devise 使用一些属性 例如电子邮件 密码等 但我还创建了一些其他属性 注册时 我想以某种方式设置它们 如何扩展注册控制器 我知道我需要实际创建一个像这样的新控制器 class Ac
  • Linux 中如何找出哪些进程正在使用交换空间?

    在Linux下 如何找出哪个进程使用交换空间更多 我发现的最好的脚本在此页面上 http northernmost org blog find out what is using your swap 这是脚本的一种变体 不需要 root b
  • 如何将 Python 框架构建与 Anaconda 结合使用

    我无法在 Mac 计算机上显示 matplotlib 动画 我已经多次尝试安装 ffmpeg 但都失败了 我开始怀疑这是否是解决问题的错误方法 I found this page 由于我从 Anaconda 中的 Spyder 应用程序运行
  • 随机数和下取整函数与轮函数

    为什么如果我使用随机数生成器和范围 0 9 我不会得到与下限函数组合相同的均匀分布 Math floor Math random 10 给出相当均匀的分布 同时Math round Math random 10 没有 Math floor
  • 在 Startup.cs 中添加 DbContextOptions 不注册数据存储

    我的问题是下面的代码在启动期间没有注册数据存储 这是我在应用程序响应中得到的特定 错误 语句 An unhandled exception occurred while processing the request InvalidOpera
  • 以真实分辨率将 MKMapView 渲染为 UIImage

    我正在使用此函数将 MKMapView 实例渲染为图像 implementation UIView Ext UIImage renderToImage UIGraphicsBeginImageContext self frame size
  • 如何在核心php中实现mvc

    没有任何框架的php如何使用mvc架构 更新于2020 02 11 重构答案以包含一些最佳实践并更接近 PHP 7 4 最简单的 PHP MVC 方法 数千个单词无法与一个干净的示例竞争 因此这里是一个简单的用例 想象一下 您想要显示一个描
  • 在Flutter中如何使用多图像选择器选择图像后获取图像路径?

    我想从选定的多个图像中获取图像路径 我正在使用这个link选择多个图像但我 获得了资产 我想要所选多个图像的路径 因为我想上传到 API 我在中添加了这个依赖项pubspec yaml如果有什么好的办法请告诉我 multi image pi
  • 处理 Winnt.h 时出现奇怪的编译错误

    当尝试通过 windows h 编译包含 winnt h 的文件时 出现以下错误 MyGl cpp microsoft sdks windows v6 0a include winnt h 964 error C2988 unrecogni
  • 基于 ListItem 特定变量对 ListItem 进行膨胀布局

    我正在使用一个SimpleCursorAdapter and a ListView显示使用 Loader 加载的一些数据 在 的里面cursor我的物品带有int从 0 到 3 我希望此 int 等于 0 1 的项目具有布局 右对齐 一种颜
  • SQS 消息延迟未按预期工作

    我正在尝试延迟发送单独的 SQS 消息 使用https docs aws amazon com AWSSimpleQueueService latest SQSDeveloperGuide sqs send message with tim
  • 编号正则表达式捕获的最大数量是多少?

    我正在维护一些通过串行无线电读取值并将它们解包到 Perl 数据结构中的代码 Don t yell at me I didn t write this if command string sx config gt sequence hex
  • 在这种情况下,WaitGroup.Wait() 是否意味着内存屏障?

    var condition bool var wg sync WaitGroup for item range items wg Add 1 go func item if meetsCondition item condition tru
  • IntelliJ - 将 Java 项目/模块转换为 Maven 项目/模块

    我在 Bitbucket 上有一个项目 仅承诺来源 为了将项目检索到新机器上 我使用了 IntelliJ 中的版本控制 gt 从版本控制中签出 然后它询问我是否想从此源创建一个新项目 我回答 是 到目前为止 一切都很好 它为我创建了一个不错
  • 禁用 Twitter Bootstrap 按钮组

    我在页面上有一个用于选择的按钮组 做出选择后 我希望按钮组仍然可见 以便用户可以看到他们所做的选择 但我不希望他们能够再使用它 有没有办法禁用按钮组 div class btn group vertical div
  • C++中的组合数(N选R)

    这里我尝试用C 编写一个程序来查找NCR 但我的结果有问题 这是不正确的 你能帮我找出程序中的错误吗 include
  • PostgreSQL:将非常大的数字的十六进制字符串转换为NUMERIC

    我正在尝试转换非常大的数字的十六进制字符串 到数字列 CREATE OR REPLACE FUNCTION hex to int hexval varchar RETURNS NUMERIC AS DECLARE result NUMERI