【发布时间】:2011-05-25 13:17:22
【问题描述】:
如何在 Oracle 中执行以下操作?
SELECT (cast field as bit) From Table
有没有办法将其转换为 Oracle 语句 使用类似于 cast 或 convert 的东西?
【问题讨论】:
-
“字段”列有什么类型?以及您想如何使用查询结果? Oracle 没有“位”类型。
如何在 Oracle 中执行以下操作?
SELECT (cast field as bit) From Table
有没有办法将其转换为 Oracle 语句 使用类似于 cast 或 convert 的东西?
【问题讨论】:
如果您想了解如何进行二进制、十六进制、八进制转换,请参阅here。 (汤姆凯特摇滚)
例如,
SQL> select to_bin( 123 ) bin, to_hex( 123 ) hex, to_oct( 123 ) oct from dual
2 /
BIN HEX OCT
--------------- --------------- ---------------
1111011 7B 173
编辑: 如果您只是想查看某个位是否打开/关闭,您可以使用 bitand 函数(Oracle 开箱即用)。这里也展示了to_bin函数,但不需要使用bitand函数。
select to_bin(1234) bin,
2 bitand(1234,1)+0 bit1,
3 bitand(1234,2)+0 bit2,
4 bitand(1234,4)+0 bit3
5 from dual
6 /
BIN BIT1 BIT2 BIT3
------------ ---------- ---------- ----------
10011010010 0 2 0
您还可以使用幂函数来获取 bitand (2^n) 的第二个参数值。例如,幂(2,0),幂(2,1),幂(2,2)
【讨论】:
CREATE OR REPLACE FUNCTION to_base (p_dec IN NUMBER, p_base IN NUMBER)
RETURN VARCHAR2
IS
l_str VARCHAR2 (255) DEFAULT NULL;
l_num NUMBER DEFAULT p_dec;
l_hex VARCHAR2 (16) DEFAULT '0123456789abcdef';
BEGIN
IF (p_dec IS NULL OR p_base IS NULL)
THEN
RETURN NULL;
END IF;
IF (TRUNC (p_dec) <> p_dec OR p_dec < 0)
THEN
RAISE PROGRAM_ERROR;
END IF;
LOOP
l_str := SUBSTR (l_hex, MOD (l_num, p_base) + 1, 1) || l_str;
l_num := TRUNC (l_num / p_base);
EXIT WHEN (l_num = 0);
END LOOP;
RETURN l_str;
END to_base;
来源:https://www.club-oracle.com/threads/how-to-convert-decimal-to-hexadecimal.16083/
【讨论】:
强制转换函数的语法是:
cast ( { expr | ( subquery ) | MULTISET ( subquery ) } AS type_name )
【讨论】: