我需要将INT值转换为 HEX(不是到 hex)。
例如,给定值1234,我想将其转换为x'1234'。
我的第一个倾向是使用十六进制函数,但这不会产生预期的结果:
hex(1234) = x'04D2'
我需要一个函数或算法
my_function(1234) = x'1234'
编辑:感谢Lennart的回答,我了解到它将等同于HEXTORAW或者 VARCHAR_BIT_FORMAT存在于DB2 for LUW上,但不适用于z / OS
答案 0 :(得分:1)
我不确定我理解你的问题,这是在球场吗?
with t (s) as (values ('1234'),(x'F0F0F0F0F0F0F0F0F0F0F0F0F0'))
select s
, case when translate(s, '', '0123456789') = ''
then hextoraw(s)
else s
end
from t;
S 2
------------- --------------------------
1234 x'1234'
ððððððððððððð ððððððððððððð
答案 1 :(得分:0)
可以使用EBCDIC_CHR功能进行此转换。此解决方案假定您的系统字符编码为EBCDIC。
请参阅此主题以供讨论,以及UDF:http://www.idug.org/p/fo/st/thread=43924
此用户定义的函数来自该线程。它将接收varchar输入,并且对于每对值,使用EBCDIC_CHR将它们转换为raw,将它们连接在一起。
CREATE FUNCTION UDFUNC.HEX2RAW(INSTR VARCHAR(1024))
RETURNS VARCHAR(2048)
DETERMINISTIC
NO EXTERNAL ACTION
CONTAINS SQL
BEGIN
DECLARE invalid_hexval CONDITION FOR SQLSTATE '22007';
DECLARE VALIDSTR VARCHAR(1024) default '';
DECLARE OUTSTR VARCHAR(2048) DEFAULT '';
DECLARE HEXCHR CHAR(16) DEFAULT '0123456789ABCDEF';
DECLARE MODVAL INT DEFAULT 0;
DECLARE LENSTR INT;
DECLARE I INT DEFAULT 0;
DECLARE J INT DEFAULT 0;
IF INSTR IS NULL THEN
RETURN NULL;
END IF;
set VALIDSTR = TRANSLATE(INSTR,'',HEXCHR);
IF (VALIDSTR <> '') THEN
SIGNAL invalid_hexval SET MESSAGE_TEXT = 'Not Hex: [' || CAST(INSTR AS VARCHAR(59))||']';
END IF;
SET MODVAL = MOD(LENGTH(INSTR),2);
IF MODVAL <> 0 THEN
SET INSTR = CONCAT('0',INSTR);
END IF;
SET LENSTR = LENGTH(INSTR);
WHILE I < LENSTR DO
SET J = 16 * (POSSTR(HEXCHR,SUBSTR(INSTR,I+1,1))-1);
SET I = I + 1;
SET J = J + (POSSTR(HEXCHR,SUBSTR(INSTR,I+1,1))-1);
SET I = I + 1;
SET OUTSTR = CONCAT(OUTSTR,EBCDIC_CHR(J));
END WHILE;
RETURN OUTSTR;
END#
功能用法:
SELECT UDFUNC.HEX2RAW('1234')
, HEX(UDFUNC.HEX2RAW('1234'))
, UDFUNC.HEX2RAW('1234567')
, HEX(UDFUNC.HEX2RAW('1234567'))
FROM SYSIBM.SYSDUMMY1;
结果:
1 2 3 4
-- ---- ---- --------
1234 áÅ 01234567