如何在DB2上将十六进制转换为十进制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在DB2上将十六进制转换为十进制相关的知识,希望对你有一定的参考价值。

我在db2数据库中有一个字段,它是十六进制格式,即0x0a,十进制格式为10。 hex字段的数据类型是char(1) for bit data

hex(myfield) gives me the hexadecimal 0A

如何在db2上的查询中将0x0a转换为10?

我试过:cast(hex(myfield),integer)int(hex(myfield))没有运气。

可能吗?

答案

AFAIK,DB2中没有内置的单一功能可以执行转换,但是有一个blog post showing how to define such a function。以下功能取自该文章:

--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION HEX2INT(str VARCHAR(8))
RETURNS INTEGER
SPECIFIC HEX2INT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
  DECLARE res INTEGER  DEFAULT 0;
  DECLARE pos INTEGER DEFAULT 1;
  DECLARE nibble CHAR(1);
  WHILE pos <= LENGTH(str) DO
    SET nibble = SUBSTR(str, pos, 1);
    SET res = BITOR(CASE WHEN BITAND(res, 134217728) != 0
                         THEN BITOR(16 * BITANDNOT(res, 134217728),
                                    -2147483648)
                         ELSE 16 * res END,
                    CASE nibble
                         WHEN '0' THEN 0
                         WHEN '1' THEN 1
                         WHEN '2' THEN 2
                         WHEN '3' THEN 3
                         WHEN '4' THEN 4
                         WHEN '5' THEN 5
                         WHEN '6' THEN 6
                         WHEN '7' THEN 7
                         WHEN '8' THEN 8
                         WHEN '9' THEN 9
                         WHEN 'A' THEN 10
                         WHEN 'a' THEN 10
                         WHEN 'B' THEN 11
                         WHEN 'b' THEN 11
                         WHEN 'C' THEN 12
                         WHEN 'c' THEN 12
                         WHEN 'D' THEN 13
                         WHEN 'd' THEN 13
                         WHEN 'E' THEN 14
                         WHEN 'e' THEN 14
                         WHEN 'F' THEN 15
                         WHEN 'f' THEN 15
                         ELSE RAISE_ERROR('78000', 'Not a hex string') 
                         END),
        pos = pos + 1;
  END WHILE;
  RETURN res;
END
@
--#SET TERMINATOR ;

所描述的各种转换操作有更多功能。

另一答案

我相信你可以简化以下内容

与fred(x)AS(VALUES'f1'),

 nurk (a) as (SELECT UPPER(substr(x,1)) from fred 
              union all 
              select UPPER(substr(a,2)) from nurk 
               where substr(a,1,1) <> ' '), 

 bare (b, c) as (select substr(a,1,1), (length(a) - 1) 
              from nurk), 

 trap (d) as ((SELECT (ASCII(B) - ASCII('7')) * 
               power(16,c) 
               FROM BARE 
               WHERE (B BETWEEN 'A' AND 'F') 
               and 
               c <> -1) 
               union 
              (SELECT (ASCII(B) - ASCII('0')) * 
               power(16,c) 
               FROM BARE 
               WHERE (B not BETWEEN 'A' AND 'F') 
               and 
               c <> -1)) 

从陷阱中选择总和(d)

跑了

db2 -f“上面的文件名”

给出了结果

241

尝试使用f1以外的值进行测试

约翰轩尼诗

另一答案

在标准SQL中(我希望如此):

with inp (val) as                                                
(values ('FF'), ('AB'), ('ABCDEF')),                             
     calc(val, urval, res, f) as                                 
(select case when length(val) > 1                                
                  then substr(val, 1, length(val)-1)             
             else '' end, val,                                   
        locate(right(val, 1),'0123456789ABCDEF')-1, 16           
 from   inp                                                      
 union  all                                                      
 select case when length(val) > 1                                
                  then substr(val, 1, length(val)-1)             
             else '' end, urval,                                 
        res + ((locate(right(val, 1),'0123456789ABCDEF')-1) * f),
        f * 16                                                   
 from   calc                                                     
 where  length(val) > 0)                                         
select  urval, res 
from    calc                                     
where   val = ''        

==>

选择RES FF 255 AB 171 ABCDEF 11,259,375

另一答案

convert(datatype,column_Name)

例如:convert(decimal(18,2),column_Name) - 其中column_Name具有十六进制值

另一答案

语法如下

select CONVERT(int, 0xFFFFFF)

如果您需要有关转换为特定数据类型的更多详细信息,请查看下面的文档

数据类型

https://technet.microsoft.com/en-us/library/ms187594(v=sql.105).aspx

转换数据类型

https://technet.microsoft.com/en-us/library/ms191530(v=sql.105).aspx

以上是关于如何在DB2上将十六进制转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DB2 AS/400 中将十进制字段转换为日期字段?

在 NODeJS 中的 TCP 套接字上将十六进制字节转换为十进制

将 DB2 SQL 十进制转换为 DATE

c_cpp C片段将十进制转换为二进制

我应该在 SQL Server 上将盐存储为 varchar 还是 varbinary 并以十六进制形式存储?

使用 CCSID 转换值以匹配 db2 中的另一个十六进制