Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在DB2上将十六进制转换为十进制_Sql_Database_Db2_Hex - Fatal编程技术网

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

Sql 如何在DB2上将十六进制转换为十进制,sql,database,db2,hex,Sql,Database,Db2,Hex,我在db2数据库中有一个十六进制格式的字段,即0x0a 这是十进制格式的数字10。对于位数据,十六进制字段的数据类型为char1 如何在db2上的查询中将0x0a转换为10 我尝试过:casthexmyfield,integer 在克斯米菲尔德 没有运气 可能吗?语法如下 select CONVERT(int, 0xFFFFFF) 如果您需要有关转换特定数据类型和从特定数据类型转换的更多详细信息,请查看下面的文档 数据类型 转换数据类型 顺便说一句,DB2中没有内置这样一个函数来执行这种转换,

我在db2数据库中有一个十六进制格式的字段,即0x0a 这是十进制格式的数字10。对于位数据,十六进制字段的数据类型为char1

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

我尝试过:casthexmyfield,integer 在克斯米菲尔德 没有运气


可能吗?

语法如下

select CONVERT(int, 0xFFFFFF)
如果您需要有关转换特定数据类型和从特定数据类型转换的更多详细信息,请查看下面的文档

数据类型

转换数据类型


顺便说一句,DB2中没有内置这样一个函数来执行这种转换,但是有一个。以下功能取自该条:

--#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 ;

还有更多用于各种转换操作的函数。

在标准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 = ''        
==>

乌尔瓦尔酒店 FF 255 AB 171
ABCDEF 11.259.375

转换数据类型、列名称

Ex:convertdecimal18,2,列名称
-这里的列名有十六进制值

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

将fred x作为值“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)) 
从陷阱中选择sumd

作为

上面的db2-f文件名

给出结果

241

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


John Hennesy

这是SQL Server的一个很好的答案,但问题是关于DB2的。如果只选择一个字段,会发生什么?直接转换为int如何?裸选择给出0x0a,而十六进制给出0A。强制转换直接给出null。事实上,位数据的初始数据类型是char1。如果我像你说的那样强制转换它,它给出了与bare select相同的值,即0x0aCHAR1,DB2数据库中的位数据通常用于标记字段,这些字段通常只包含“1”或“0”,假设EBCIDC,它们将是x“F1”或x“F0”。你用它做什么,因为它包含x'0A'?您对检索到的值做了什么?假设您将它拉回到某个HLL中,在那里转换它可能会更好。尝试简单地使用AscimyField。我发现在DB2中无法直接访问这样一个字段的数值,这令人难以置信。你知道为什么吗?金融、银行、零售业很少使用不同的市场十六进制,不必太认真。
 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))