我有一个表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'的值是假的。
答案 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';