Как проверить значение Alien_Body_Part (NCLOB) в списке проекций Oracle?
У меня есть таблица с тремя столбцами NCLOB. Для каждого NCLOB я хочу подсчитать, сколько не "TC" или "NC". Случай, когда... конец подхода работает для столбцов 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 ответ
Решение
Сравните только первые символы:
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