Как проверить значение Alien_Body_Part (NCLOB) в списке проекций Oracle? - PullRequest
2 голосов
/ 20 апреля 2011

У меня есть таблица с тремя столбцами NCLOB.Для каждого NCLOB я хочу подсчитать, сколько не «TC» или «NC».Подход , когда подход ... end работает для столбцов NVARCHAR2, но не для NCLOB.Как проверить значения NCLOB в списке проекций?

Oracle Database 11g Release 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 Ответ

1 голос
/ 20 апреля 2011

Сравнение только первых символов:

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 не являются причиной ошибки здесь (вы не можете напрямую сравнивать CLOB / NCLOBв SQL), рассмотрим:

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

select * from t where alien_body_part = 'TC'

ORA-00932: inconsistent datatypes: expected - got NCLOB
...