我有下表:
create table Mike_Test
( Id raw(32) default sys_guid() not null primary key,
Value varchar2(80) not null unique
);
我现在插入此表:
INSERT INTO Mike_Test (VALUE) VALUES ('Blah');
我可以确认那里有一个新行:
select * from Mike_Test;
我明白了:
08364fc81419429d83c9bcedb24a9a57 Blah
现在我尝试用以下方法选择该行:
select * from Mike_Test WHERE ID='08364fc81419429d83c9bcedb24a9a57';
但是,我得到零行和零错误。我做错了什么?
答案 0 :(得分:9)
这是一种RAW数据类型,你必须这样查询:
select .... where id=hextoraw('08364fc81419429d83c9bcedb24a9a57') ....
答案 1 :(得分:4)
我认为您可能需要在ID
值周围使用HEXTORAW
函数。此函数将十六进制字符串转换为相应的RAW
值。
换句话说,您的查询应如下所示:
select * from Mike_Test WHERE ID=HEXTORAW('08364fc81419429d83c9bcedb24a9a57');
答案 2 :(得分:3)
以下内容来自SQLPlus,它正确处理输出:
SQL> select * from Mike_Test;
ID
--------------------------------
VALUE
--------------------------------------------------------------------------------
4FBD50C370BC4A7F85E3DF034D120930
Blah
SQL> select * from Mike_Test WHERE ID='4fbd50c370bc4a7f85e3df034d120930';
no rows selected
SQL> select * from Mike_Test WHERE ID='4FBD50C370BC4A7F85E3DF034D120930';
ID
--------------------------------
VALUE
--------------------------------------------------------------------------------
4FBD50C370BC4A7F85E3DF034D120930
Blah
我发誓,每天使用它都会变得更加愚蠢。我发誓。
答案 3 :(得分:1)
添加到我的答案(我不想编辑我的原始答案,因为这是一个切线):
我试图做的隐式演员和推荐的HEXTORAW方法之间存在巨大的性能差异。隐式转换的查询计划类似于:
SELECT STATEMENT 3.0 3 37877 1 52 3 ALL_ROWS
TABLE ACCESS (FULL) 3.0 3 37877 1 52 1 TPMDBO MIKE_TEST FULL TABLE 1
HEXTORAW是:
SELECT STATEMENT 1.0 1 15463 1 52 1 ALL_ROWS
TABLE ACCESS (BY INDEX ROWID) 1.0 1 15463 1 52 1 TPMDBO MIKE_TEST BY INDEX ROWID TABLE 1
INDEX (UNIQUE SCAN) 1.0 1 8171 1 1 TPMDBO SYS_C007969 UNIQUE SCAN INDEX (UNIQUE) 1
如您所见,HEXTORAW方法将触及表中的主键索引。这是因为隐式转换将遵循右操作数(我指定的GUID)的“字符串”类型,并将数据库中的所有GUID转换为字符串。绝对值得考虑的事情。