如何在 DB2 上将十六进制转换为十进制
How to convert hexadecimal to decimal on DB2
我在 db2 数据库中有一个十六进制格式的字段,即 0x0a
这是十进制格式的数字 10。十六进制字段的数据类型是 char(1) for bit data
.
hex(myfield) gives me the hexadecimal 0A
如何在 db2 的查询中将 0x0a 转换为 10?
我试过:cast(hex(myfield),integer)
和 int(hex(myfield))
运气不好。
可能吗?
语法如下
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 中没有这样一个内置函数可以执行该转换,但是有一个 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 ;
描述的各种转换操作的函数更多。
标准 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
转换(数据类型,column_Name)
例如:转换(十进制(18,2),column_Name)
--这里 column_Name 有十六进制值
我相信你可以简化以下内容
WITH 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))
select 来自陷阱的总和 (d)
运行 为
db2 -f "filename of above"
给出了
的结果
241
尝试使用 f1 以外的值进行测试
约翰轩尼诗
我在 db2 数据库中有一个十六进制格式的字段,即 0x0a
这是十进制格式的数字 10。十六进制字段的数据类型是 char(1) for bit data
.
hex(myfield) gives me the hexadecimal 0A
如何在 db2 的查询中将 0x0a 转换为 10?
我试过:cast(hex(myfield),integer)
和 int(hex(myfield))
运气不好。
可能吗?
语法如下
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 中没有这样一个内置函数可以执行该转换,但是有一个 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 ;
描述的各种转换操作的函数更多。
标准 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
转换(数据类型,column_Name)
例如:转换(十进制(18,2),column_Name) --这里 column_Name 有十六进制值
我相信你可以简化以下内容
WITH 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))
select 来自陷阱的总和 (d)
运行 为
db2 -f "filename of above"
给出了
的结果241
尝试使用 f1 以外的值进行测试
约翰轩尼诗