如何在Oracle中验证数据是否为十六进制

时间:2009-09-29 05:23:08

标签: sql oracle

我有一个表tbl_1,其字段为fl_1(varchar2类型),包含十六进制格式。现在我想验证(查询)哪里是Hexa格式,哪里不是。

oracle脚本中的任何想法(SQL语法)?

CREATE TABLE TBL_1 (HEX VARCHAR2(20));
INSERT INTO TBL_1 VALUES('9851010A'); 
INSERT INTO TBL_1 VALUES('9851010B'); 
INSERT INTO TBL_1 VALUES('FIRDI2'); 
INSERT INTO TBL_1 VALUES('FIRDI'); 
commit;

只应该'FIRDI'和'FIRDI2'的值是假的。

3 个答案:

答案 0 :(得分:3)

只测试该字段是否仅包含十六进制字符:

SELECT *
  FROM tbl_1
 WHERE translate(upper(fld_1),
                 '0123456789ABCDEF',
                 NULL) IS NOT NULL;

此查询返回非十六进制值的行。您可以或不可以将trim()添加到条件中。这取决于空间填充是否会使您的观点中的数据无效。

答案 1 :(得分:0)

您可以使用to_number和to_char函数进行十六进制翻译。

SELECT TO_number('0A','XX') from dual
10

SELECT TO_CHAR(10,'XX') from dual
 A

如果您的字符串不代表十六进制数,则会出现无效的数字异常。

SELECT TO_number('RR','XX') from dual

ORA-01722: invalid number

答案 2 :(得分:0)

我无法将上面的翻译示例转化为可靠的解决方案。

我改用REGEXP_INSTR创建了一个解决方案。

SELECT * FROM tbl_1 WHERE REGEXP_INSTR( UPPER(fld_1), '[^0123456789ABCDEF]' ) > 0;

上面的代码将返回包含非十六进制字符的行。

我还把它变成了一个is_hex函数,该函数返回'T'或'F':

create or replace FUNCTION "IS_HEX" (i_value in VARCHAR2)
RETURN CHAR
IS
    v_result CHAR(1) := 'F';
BEGIN

    IF REGEXP_INSTR( upper('0123456789ABCDEF'), '[^0123456789ABCDEF]') = 0 THEN
        v_result := 'T';
    END IF;

    return v_result;
END;

允许您执行以下操作:

SELECT * FROM tbl_1 WHERE is_hex(fld_1) = 'F';