2011-04-20 42 views
2

我有一張有三個NCLOB列的表。對於每個NCLOB,我想要計算多少不是'TC'或'NC'。 情況下...結束方法適用於NVARCHAR2列,但不適用於NCLOB。我怎樣才能在投影列表中測試NCLOB的值?如何在Oracle投影列表中測試Alien_Body_Part(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 
+2

+1耐人尋味的列名。 – 2011-04-20 12:40:37

回答

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個字符,比較所述前3個字符將是足夠的(作爲NCLOB將等於只有2個字符長的'TC',這些字符顯然等於'TC')。

而且無論是CASE也沒有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 NCLOB 
+0

謝謝文森特。這工作。 – 2011-04-20 11:57:20