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

mik*_*_x_ 5 sql database db2 hex

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

hex(myfield) gives me the hexadecimal 0A
Run Code Online (Sandbox Code Playgroud)

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

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

是否可以?

dat*_*rik 3

AFAIK,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 ;
Run Code Online (Sandbox Code Playgroud)

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

  • 不同的市场 - 十六进制在金融、银行、零售领域使用较少 (6认同)
  • 我觉得令人难以置信的是,DB2 中没有办法直接访问这样一个字段的数值。知道为什么吗? (2认同)