我有一个有三个NCLOB列的表。对于每个NCLOB,我想要一个计数,有多少不是'TC‘或'NC’。的案子.end方法适用于NVARCHAR2列,但不适用于NCLOB。如何测试投影列表中NCLOB的值?
Oracle数据库11g版本11.1.0.6.0
这个最小的例子演示了根本问题。
create table t (
alien_body_part nclob
);
insert into t(alien_body_part) values(null);
insert into t(alien_body_part) values('TC');
insert into t(alien_body_part) values('NC');
insert into t(alien_body_part) values('Extended Mandible');
select case when alien_body_part in ('TC', 'NC') then 0 else 1 end from t
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got NCLOB发布于 2011-04-20 10:45:33
只比较第一个字符:
SQL> SELECT dbms_lob.substr(alien_body_part, 4000, 1) body_part,
2 CASE
3 WHEN dbms_lob.substr(alien_body_part, 4000, 1)
4 IN ('TC', 'NC') THEN
5 0
6 ELSE
7 1
8 END is_nc_or_tc
9 FROM t;
BODY_PART IS_NC_OR_TC
---------------------- -----------
1
TC 0
NC 0
Extended Mandible 1在这种情况下,由于比较的一侧只有2个字符,所以比较前3个字符就足够了(因为NCLOB只有在两个字符长且这些字符明显等于'TC‘时才等于'TC’)。
此外,无论是情况还是IN都不是造成此处错误的原因(不能直接比较SQL中的CLOB/NCLOB ),请考虑:
SQL> select * from t where alien_body_part = 'TC';
select * from t where alien_body_part = 'TC'
ORA-00932: inconsistent datatypes: expected - got NCLOBhttps://stackoverflow.com/questions/5728922
复制相似问题