2011-04-20 4 views
2

세 개의 NCLOB 열이있는 테이블이 있습니다. 각 NCLOB에 대해 얼마나 많은 'TC'또는 'NC'가 아닌지 계산하고 싶습니다. case ... end 접근 방식은 NVARCHAR2 열에서는 작동하지만 NCLOB에서는 작동하지 않습니다. 투영 목록에서 NCLOB의 값을 테스트하려면 어떻게해야합니까?Oracle 프로젝션 목록에서 Alien_Body_Part (NCLOB) 값을 테스트하는 방법은 무엇입니까?

오라클 데이터베이스 11.1.0.6.0

이 최소한의 예는 루트 문제를 보여줍니다 11g 릴리스.

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 
+2

1 :

는 또한 CASE 나 IN도는 (당신이 SQL에서 직접 CLOB/NCLOB를 비교할 수 없습니다), 고려 여기 오류의 원인이다. –

답변

1

첫 번째 문자를 비교한다

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 자 길이 때문에, NCLOB가 동일하므로 (충분할 제 3자를 비교 'TC'는 문자가 2 문자이고 문자가 'TC'와 분명히 동일 할 경우에만). 흥미로운 열 이름에 대한

SQL> select * from t where alien_body_part = 'TC'; 

select * from t where alien_body_part = 'TC' 

ORA-00932: inconsistent datatypes: expected - got NCLOB 
+0

감사합니다. Vincent. 이것은 효과가 있었다. –

관련 문제