【问题标题】:How to test value of Alien_Body_Part (NCLOB) in Oracle projection list?如何测试 Oracle 投影列表中 Alien_Body_Part (NCLOB) 的值?
【发布时间】:2011-04-20 10:34:45
【问题描述】:

我有一个包含三个 NCLOB 列的表。对于每个 NCLOB,我想计算有多少不是“TC”或“NC”。 case when ... 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

【问题讨论】:

  • +1 表示有趣的列名。

标签: sql oracle oracle11g ora-00932


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 2021-12-23
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多