2

3 つの 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
4

1 に答える 1

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 が 'TC' と等しくなるのは、長さが 2 文字であり、それらの文字が明らかに '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
于 2011-04-20T10:45:33.163 に答える